从C++调用C#,反向P/Invoke,混合模式DLL和C++/CLI

问题描述:

据我所知,我可以使用反向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

这里有答案,我所知的:

  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

请注意,您也可以执行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 
} 

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