C#PB 호출 dll 상세 정보 생성

14646 단어 c#작업 일지
선언: dll을 호출할 때, 먼저 dll이 어떤 언어로 컴파일되었는지 정확히 물어야 한다. 그렇지 않으면 방향이 틀리면 많은 무용지물이 생길 수 있다.
테스트 오류 프로세스:
  • 직접 참조 오류: "...COM 구성 요소 아님"
  • DllImportm 방식
  • [DllImport("yhinterface.dll", EntryPoint = "f_sblwsk", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
     public static extern void f_sblwsk(string hospitalComb, ref object ret);
    

    더 자세한 c# 외부 dll 호출
    상기 방법을 사용하여 발생한 오류 보고
  • 직접 참조 시 "보호된 메모리에 쓰기 또는 읽기 시도, 일반적으로 메모리가 손상되었음"
  • 오류 발생
  • DllImport에서 메소드 입구를 찾을 수 없음
  • 모듈을 로드할 수 없음
  • 솔루션 접근 방식:
  • 처음에 dll이 pb로 생성된 것을 모르고 c++로 생성된 것으로 오해했기 때문에 오류 보고가 입구를 찾을 수 없을 때 제공자가 dll를 잘못 준 것을 의심했다. 당시 인터페이스 문서도 명확하게 말하지 않고 이 문제를 계속 찾았다.
  • 나중에 이 dll에 등록하여 관련 의존항을exe와 같은 등급 디렉터리에 넣으면 바로 인용할 수 있다
  • 이후 직접 호출할 때 new의 대상이 필요합니다. 두 가지 방식을 사용했습니다
  • 흔한 new
  • COClass_n_yhinterface b = new COClass_n_yhinterface();
    
  • 반사
  • 
    ```csharp
    private object Invoke(string lpFileName, string Namespace, string ClassName, string lpProcName, object[] ObjArray_Parameter)
            {
                try
                { //      
                    Assembly MyAssembly = Assembly.LoadFrom(lpFileName);
                    Type[] type = MyAssembly.GetTypes();
                    foreach (Type t in type)
                    {//             
                        if (t.Namespace == Namespace && t.Name == ClassName)
                        {//              
                            MethodInfo m = t.GetMethod(lpProcName);
                            if (m != null)
                            {
                                object o = Activator.CreateInstance(t);
                                return m.Invoke(o, ObjArray_Parameter);
                            }
                            else Console.WriteLine("      !");
                        }
                    }
                }
                catch (System.NullReferenceException e)
                {
                    Console.WriteLine(e.Message);
                }//catch
                return (object)0;
            }
    

    위의 메서드는 "...메모리 손상"을 보고합니다.
  • dll이 c++로 컴파일된 것이 아니라고 의심하기 시작했습니다. 그래서 역컴파일 도구를 찾았습니다. 두 가지를 찾았습니다. 하나는 depends22 입니다.x86, pb 역컴파일 도구;depends22를 통해x86에서 dll의 함수 입구를 볼 수 있고 필요한 함수가 없다. 역컴파일 도구가 pb프로그램을 컴파일한 후에 새로운 방향을 찾기 시작한다.pb의 dll 등록: pb 운행 환경이 필요하고 PB 환경 변수는 조합할 필요가 없다. PB의 지원 라이브러리 파일을 시스템32에 넣으면 된다.Powerbuilder를 설치할 수도 있습니다.아니면 pb의*.dll 및.exe를 함께 놓으면 PB 프로그램을 실행할 수 있습니다. 참고: C# PB가 쓴com 구성 요소 dll C#WEBSERVICE PB가 생성한 DLL
  • 을 호출합니다.
  • 결과가 나온 후에도 주의해야 한다
  • m_Com_Document.InvokeMember("f_sblwsk", BindingFlags.InvokeMethod, null, objDoc, new object[] { hospitalComb, RetStr });
    

    이런 식으로 함수 방법이 참조 ref 또는 out 유형일 때 파라미터 값은 변화 해결 방안이 발생하지 않는다.
    				object[] args = new object[2];
                    string RetStr = "123";
                    args[0] = hospitalComb;
                    args[1] = RetStr;
    
                    ParameterModifier pMod = new ParameterModifier(2);
                    pMod[1] = true;
                    ParameterModifier[] mods = { pMod };
                    Type m_Com_Document = Type.GetTypeFromProgID("PB90.n_yhinterface");
    
                    object objDoc = Activator.CreateInstance(m_Com_Document);
                    object tempObj = m_Com_Document.InvokeMember("f_sblwsk", BindingFlags.InvokeMethod, null, objDoc, args,mods,null,null);
                    Console.WriteLine("args[1]:" + Convert.ToString(args[1]));
                    Console.WriteLine("RetStr:" + Convert.ToString(RetStr));
                    Console.WriteLine("tempObj:" + Convert.ToString(tempObj));
                    RetStr = Convert.ToString(args[1]);
                    string[] datas = RetStr.Split('|');
                    Console.WriteLine("datas[0]:" + datas[0]);
    

    참조: 배열을 사용하여 ParameterModifier 이상을 사용하여 해결
    추가적으로 강화해야 할 사항:
    반사값 유형과 인용 유형, 값의 변화wcf와 wpf의 이해이상의 이해는 때때로 이미 답을 찾았고 인지적 결함으로 인해 정답pass를 떨어뜨렸고 헛수고도 많이 했다. 인터넷의 자료를 볼 때 다른 사람의 해결 방안을 만나면 인내심을 가지고 검증해야 한다. 주마관화하지 마라

    좋은 웹페이지 즐겨찾기