簡體   English   中英

在托管C ++中使用C#DLL(命令行)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM