簡體   English   中英

從C ++,反向P /調用,混合模式DLL和C ++ / CLI調用C#

[英]Calling C# from C++, Reverse P/Invoke, Mixed Mode DLLs and C++/CLI

據我所知,我可以使用反向P / Invoke從C ++調用C#。 反向P / Invoke只是一個例子:

  1. 創建托管(c#)類。
  2. 創建一個c ++ / cli(以前管理的c ++)類庫項目。 使用它來調用托管c#類(可能通過引用)。
  3. 從本機c ++調用c ++ / cli代碼。

問題:

  1. 它是否正確?
  2. 在步驟2中創建的DLL是否稱為混合模式DLL?
  3. 就MS而言,C ++ / CLI是否完全取代了托管C ++?
  4. COM完全避免使用這種方法嗎?
  5. 在什么時候創建和運行CLR,由誰?

提前致謝

以下是我所知的答案:

  1. 是的,它是一個混合模式DLL(事實上,你可以管理你的本機C ++項目的一個文件,並在該文件中創建這個C ++ / CLI類,並直接從該文件調用代碼。你甚至不需要單獨的DLL來完成這個。
  2. C ++ / CLI和托管C ++都代表相同的東西。 唯一的區別是在舊版本中直到Visual Studio 2003,它被稱為托管C ++。 后來,語法發生了很大變化,並重命名為C ++ / CLI。 有關詳細信息,請查看此鏈接
  3. 只要調用托管DLL,就會使用CLR。

注意,您還可以執行IL往返C#dll和導出靜態方法,這些方法與C ++ / CLI中的導出基本相同。 但是,這總是一個后編譯步驟,它確實有一些警告 (你的C ++ / CLI導出也是如此,順便說一句。)。

您可以ILDASM C#和C ++ / CLI DLL來查看導出的方式; 它是這樣的(來自網上的樣本 ):

// unmexports.il
// Compile with : ilasm unmexports.il /dll
assembly extern mscorlib {}
..assembly UnmExports {}
..module UnmExports.dll
// This flag is important
..corflags 0x00000002
// This instructs the CLR to create a marshaling thunk for the unmanaged caller
..vtfixup [1] int32 fromunmanaged at VT_01
..data VT_01 = int32(0)
..method public static void foo()
{
..vtentry 1:1
..export [1] as foo
ldstr "Hello from managed world"
call void [mscorlib]System.Console::WriteLine(string)
ret
}

使用ilasm 2.0,您需要更少的代碼,因為它可以自己生成大部分的垃圾。 現在真的只需要.export指令。

// unmexports.il
// Compile with : ilasm unmexports.il /dll
.assembly extern mscorlib { auto }
.assembly UnmExports {}
.module UnmExports.dll
.method public static void foo()
{
  .export [1] as foo
  ldstr "Hello from managed world"
  call void [mscorlib]System.Console::WriteLine(string)
  ret
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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