[英]Using C# DLL in managed C++ (command line)
我已經查看了一些標題就像這個問題一樣,但他們要么不談論命令行,要么因為某些原因似乎不適合我。 從我所讀到的,似乎我可以“簡單地”做以下事情:
虛擬代碼(C#):
using System;
public static class Foo {
public static void Bar() {
Console.WriteLine("o3o");
}
}
更多虛擬代碼(Visual C ++):
#using <test.dll>
int main() {
Foo::Bar();
return 0;
}
C#DLL編譯使用:
csc /out:test.dll /t:library src\cs\Foo.cs
Visual C ++目標文件使用以下編譯:
cl /Ox /clr /AI. /c src\vc\test.cpp
可執行文件編譯使用:
link /out:test.exe test.obj
運行可執行文件時拋出以下異常:
Unhandled Exception: System.TypeLoadException: Could not load type 'Foo' from assembly 'test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
at main()
at mainCRTStartup()
我有一種強烈的感覺,我應該在鏈接階段引用DLL,但我找不到任何鏈接類似於GCC的-l
選項的DLL的選項。 嘗試將DLL與.obj
一起傳遞給link
會導致它告訴我不支持鏈接程序集。 有趣的是,如果我構建.netmodule
而不是DLL,即:
csc /out:test.dll /t:module src\cs\Foo.cs
並將#using
指令更改為
#using <test.netmodule>
可執行文件運行沒有錯誤。 這感覺.netmodule
,因為我認為沒有人在.netmodule
打包代碼(什么是 .netmodule
s,無論如何?)。
您的所有步驟都應該有效,但一個非常簡單的問題是阻止您的程序運行。
即:您的C#DLL程序集名稱是test
,並且您的C ++ / CLI exe程序集具有相同的名稱。 他們都有相同的身份。
因此,當在test
程序集中查找Foo::Bar
時,加載程序首先檢查程序集是否已加載到AppDomain中。 它是 - 它是您的C ++ / CLI exe,並且您不能在同一AppDomain中同時加載具有相同標識的多個程序集。 您的C#dll甚至沒有嘗試過。
只需更改其中任何一個,一切都會正常工作:
link /out:test2.exe test.obj
至於什么是.netmodule
,它是用於靜態鏈接托管代碼的格式,這就是為什么你設法將C#代碼與C ++ / CLI代碼鏈接而沒有問題的原因。 它大致相當於托管代碼的.lib
文件。
而你是對的,它不經常使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.