![](/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.