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

2019-06-24 15:08发布

据我所知,我可以使用反转的P / Invoke调用C#从C ++。 反转的P / Invoke是简单的情况下:

  1. 创建你管理(C#)类。
  2. 创建一个C ++ / CLI(原托管C ++)类库项目。 使用这个(通过引用大概)来调用托管C#类。
  3. 从调用本机C与C ++ / CLI ++编写代码。

问题:

  1. 它是否正确?
  2. 在步骤2中创建的DLL被称为混合模式DLL?
  3. 有C ++ / CLI完全取代托管C ++就MS而言?
  4. COM是使用这种方法完全避免?
  5. 在什么情况下会被创建的CLR和运行,以及由何人?

提前致谢

Answer 1:

这里有答案,我所知的:

  1. 是的,这是一个混合模式DLL(事实上,你可以让你的本地C ++项目管理的一个文件,在该文件中创建这个C ++ / CLI类,并直接从该文件调用的代码。你甚至不需要一个单独的DLL来实现这一目标。
  2. C ++ / CLI和托管C ++都表示同样的事情。 唯一的区别是,在旧版本,直到Visual Studio 2003中,它被称为托管C ++。 后来,语法改变了很多,并更名为C ++ / CLI。 看看这个链接了解详情。
  3. 每当到托管DLL的调用由CLR将被使用。


Answer 2:

请注意,你也可以做的C#DLL导出静态方法,其工作基本相同,在C ++ / CLI的出口IL往返。 然而,这始终是一个编译后的一步,它也有一些注意事项 (其中你的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
}


Answer 3:

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


文章来源: Calling C# from C++, Reverse P/Invoke, Mixed Mode DLLs and C++/CLI
标签: c# c++ clr c++-cli