2009-07-01 30 views
15

據我所知,我可以使用反向P/Invoke從C++調用C#。反向P/Invoke僅僅是一種情況:從C++調用C#,反向P/Invoke,混合模式DLL和C++/CLI

  1. 創建您管理的(c#)類。
  2. 創建一個C++/cli(以前管理的C++)類庫項目。使用它來調用託管的c#類(大概通過引用)。
  3. 從本地C++調用C++/cli代碼。

問題:

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

在此先感謝

+1

當你這樣做時,你會發現gcroot <>模板類有用。 – 2009-07-01 12:16:24

回答

20

這裏有答案,我所知的:

  1. 是的,它是一種混合模式DLL(事實上,你可以做一個您的本地C++項目的文件被管理並在該文件中創建該C++/CLI類,並直接從該文件中調用代碼,甚至不需要單獨的DLL來完成此任務。同樣的t興。唯一的區別是,在直到Visual Studio 2003的舊版本中,它被稱爲託管C++。後來,語法發生了很大的變化,它被重命名爲C++/CLI。有關詳細信息,請參閱this link
  2. 每當調用受管DLL時都會使用CLR。
+1

可以使用+10按鈕 - 謝謝。 – ng5000 2009-07-01 12:11:15

2

請注意,您也可以執行IL往返C#dll並導出靜態方法,其工作方式與C++/CLI中的導出基本相同。但是,這總是一個後編譯步驟,它的確有some caveats(您的C++/CLI導出也是這樣)。

您可以使用ILDASM C#和C++/CLI DLL來查看導出是如何進行的;它是這樣的(從a sample on the net):

// 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 
} 
1

隨着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 
}