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

据我了解,我可以使用反向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 }