我有一个在Visual Studio 2010中创建的C ++项目,它需要从C#DLL执行代码。我是用
完成的#import "pathname\filename.tlb" raw_interfaces_only
指令,以及CoInitialize(NULL)和CoUninitialize()COM调用。
C#DLL在VS2012中编译,目标是.NET 4.5。
我能够编译并运行该项目,似乎一切都很好,但我们注意到一些函数调用的差异。通过在VS 2012中加载完全相同的C ++项目,打开配置属性中的/ clr,并通过修改记事本中的.vcxproj文件将目标框架(C ++项目)更改为v4.5来验证这一点。
所以,我想我的问题是:
为什么C ++项目需要针对.NET框架? C#DLL本身不应该能够处理吗? (Hans Passant回答)
为什么可以通过带有/ clr off的C ++运行C#.NET v4.5 DLL,并且没有任何警告它可能不起作用? (Hans Passant回答)
为什么我甚至会从函数调用中获得结果? C#DLL怎么可能“有效”(返回连贯的结果)呢?为什么在定位.NET v4.0时会返回不同的值?
是否可以使用C ++代码中的C#DLL,同时仍然使用VS 2010?或者我是否需要将项目切换到VS 2012?
提前致谢。
答案 0 :(得分:3)
本机C ++项目根本不以.NET Framework为目标。项目创建向导有点笨拙,在创建C ++项目时它不会隐藏组合框。
注册C#DLL所需的框架版本。勾选“注册COM互操作”构建设置或通过运行Regasm.exe明确地自动完成。
本机C ++代码可以毫无问题地调用C#代码,这只是您使用COM获得的一个好东西。其基本目的是提供合同和粘合剂,以允许一种语言调用另一种语言编写的代码。 CLR具有非常好的COM支持,使其看起来非常简单。对于C ++来说情况并非如此,编写COM客户端代码通常会由于冗长而令人不快,并且很容易出错。使用raw_interfaces_only
是一个错误,你没有通过智能指针和异常错误处理获得内存管理的好处。