从C++调用C#,反向P/Invoke,混合模式DLL和C++/CLI
问题描述:
据我所知,我可以使用反向P/Invoke从C++调用C#。反向P/Invoke仅仅是一种情况:从C++调用C#,反向P/Invoke,混合模式DLL和C++/CLI
- 创建您管理的(c#)类。
- 创建一个C++/cli(以前管理的C++)类库项目。使用它来调用托管的c#类(大概通过引用)。
- 从本地C++调用C++/cli代码。
问题:
- 这是正确的吗?
- 步骤2中创建的DLL是否称为混合模式DLL?
- 就MS而言,C++/CLI是否完全取代了Managed C++?
- COM是否完全避免使用这种方法?
- CLR将在什么时候创建和运行,由谁来执行?
在此先感谢
答
请注意,您也可以执行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
}
当你这样做时,你会发现gcroot 模板类有用。 – 2009-07-01 12:16:24