我想开发一个程序(EXE)与外部C#模块互操作的插件。 该插件是需要三个dll的一个:此DLL(A)调用包装DLL(母语/管理,在C ++ / CLI)(B)为与C#DLL(C)互操作。
甲应该部署时由调用程序(EXE)加载。
在测试中,将显示从C#DLL消息,该消息告诉我DLL中的一个被正确地由一个C ++测试器加载,并随后作出了其他DLL成功呼叫。
在部署时,DLL A由EXE加载,如果它仅显示一条消息。 然而,添加的代码调用的DLL乙线时,EXE不再识别DLL A.
我已确保所有文件都在正确的地方。 所以我觉得问题出在互操作的代码行额外调用DLL B.任何想法,我应该寻找问题在哪里呢?
这是在DLL中的导出函数:
int WINAPI Init()
{
FILE * pConsole;
AllocConsole();
freopen_s(&pConsole, "CONOUT$", "wb", stdout);
printf("Started\n");
//These two line below call the wrapper dll B
// which serves as a middle man between dlls A and C
NativeExport_ClientWrapper* client = createMyClass();
if (client) client->Test();
return 1;
}
下面是包装B的非托管方:
//----------------------------------------------
//NativeExport_ClientWrapper.h
//----------------------------------------------
//#pragma once
#pragma once
#pragma unmanaged
#define THISDLL_EXPORTS
#ifdef THISDLL_EXPORTS
#define THISDLL_API __declspec(dllexport)
#else
#define THISDLL_API __declspec(dllimport)
#endif
class ILBridge_ClientWrapper;
class NativeExport_ClientWrapper {
private:
ILBridge_ClientWrapper* __bridge;
public:
NativeExport_ClientWrapper();
public:
~NativeExport_ClientWrapper();
public:
THISDLL_API void Test();
};
extern "C" THISDLL_API NativeExport_ClientWrapper* createMyClass();
这里是包装的管理方:
//----------------------------------------------
//ILBridge_ClientWrapper.h
//----------------------------------------------
#pragma once
#pragma managed
#include <vcclr.h>
class ILBridge_ClientWrapper {
private:
gcroot<Client^> __Impl;
public:
ILBridge_ClientWrapper() {
__Impl = gcnew Client;
}
void Test() {
__Impl->test();
}
};