관리되지 않는 Visual C++에서 DLL을 작성했으며 C# 및 C++ 응용 프로그램 모두에서 작동하도록 약간의 문제가 있습니다. 다음은 C++ DLL의 프로토 타입 모습입니다 같은 :관리 코드에서 관리되지 않는 DLL 함수 호출 오류
extern "C" __declspec(dllexport) int WINAPI ZBNConnect(UCHAR dev, LPARAM hWnd, ZBCallbackFn rfn, ZBCallbackFn nfn, int DevType, byte * DevAddr, ZBCallbackFn dfn);
내 C# 응용 프로그램 함수, 아무 문제에 연결할 수 있지만,이 예외가 발생하는 함수를 호출 할 때 :
catch (Exception e) { /* ... */ }
을 e.Message = "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."
이상하게도 DLL의 프로토 타입에서 WINAPI
을 가져 와서 다시 컴파일하면 C# 응용 프로그램이 아무 문제없이이 함수를 호출합니다. 불행하게도, WINAPI
은 그 기능이 C++ 애플리케이션에서 정의되는 방법이기 때문에 남아 있어야합니다.
public delegate int ZBNConnectDelegate(uint dev, IntPtr hWnd, USBCallbackDelegate rfn, NotifyCallbackDelegate nfn, uint DevType, byte[] DevAddr, ZBdebugCallbackDelegate dfn);
public ZBNConnectDelegate ZBNConnect;
procName = "ZBNConnect";
fUintPtr = Kernel32.GetProcAddress(dllHandle, procName);
if (fUintPtr == UIntPtr.Zero)
{
throw new ArgumentException(procName);
}
fIntPtr = unchecked((IntPtr)(long)(ulong)fUintPtr);
ZBNConnect = (ZBNConnectDelegate)Marshal.GetDelegateForFunctionPointer(fIntPtr, typeof(ZBNConnectDelegate));
가 어떻게이 작업을 얻을 수있는 C# 응용 프로그램을 수정할 수 있습니다
기능
는 현재이 같은 C# 응용 프로그램에서 프로토 타입? 감사.편집 : 추가 정보
은 정적 링크 ([DllImport...]
)가있는 하드웨어가 시스템에 장착 된 하드웨어가 런타임에로드를 지원하는 다른 DLL을 부착 따라 때문에 옵션이 아닙니다. 두 DLL은 모두 동일한 API 호출을 사용합니다.
이 –
당신이 프로토 타입에 통근을 넣어 시도해 봤어 완전히 다르다 DLL 지옥이 아니다? – bratao
그럼, 어떻게'ZBNConnect'를 초기화하고 관리되지 않는 함수를 가리 키도록할까요? 서면으로, 그것은'null'이 될 것입니다. 왜 P/Invoke ('[DllImport] static extern')를 사용하지 않으시겠습니까? –