![](/img/trans.png)
[英]How can you make a C++/CLI DLL resolve a dependency on managed assemblies (DLLs), without using the GAC?
[英]How do you make a method avaible to other dlls in a c++ dll in managed code?
第一段代码是我正在处理的示例,在将其更改为第二个示例之后,它对__declspec(dllexport)执行,它给出__declspec(dllexport)不能应用于具有__clrcall调用约定的函数。 删除那段代码会使dll编译,但该方法对目标dll是不可用的。 此外,当我使用PE资源管理器查看DLL时,没有导出方法。 是否存在__declspec(dllexport)的托管变体?
extern "C" __declspec(dllexport) int UserInstruction (HWND hWnd,
HINSTANCE hInst,
double FAR *Function,
char FAR *Str1,
char FAR *Str2)
{
strcpy(Str1, "TEST FUNCTION");
return (TRUE);
}
extern "C" __declspec(dllexport) int UserInstruction (IntPtr hWnd, IntPtr hInst, double *Function, char *Str1, char *Str2)
{
Str1 = "TEST FUNCTION";
return (true);
}
C ++ / CLI编译器支持导出托管函数。 它会自动生成一个thunk,在必要时加载并初始化CLR,以便可以执行托管代码。 小心开销。 但是,您不能将任何托管类型用于函数参数。 在你的情况下IntPtr。 这没有意义,调用您的函数的非托管代码将不使用托管类型。
你必须自己组织他们。 这里不是问题,这些是指针,所以你可以简单地转换为IntPtr:
extern "C" __declspec(dllexport)
int __stdcall UserInstruction (HWND hWnd, HINSTANCE hInst, double FAR *Function, char FAR *Str1, char FAR *Str2)
{
IntPtr windowPtr = (IntPtr)hWnd;
IntPtr instancePtr = (IntPtr)hInst;
// etc..
}
明确选择调用约定总是一个好主意。 因为这个原因,我添加了__stdcall,这是导出的DLL函数最常见的一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.