VS2010中的c++运行一个针对.net 4.5的托管c# DLL

本文关键字:net DLL 运行 c++ 中的 一个 VS2010 | 更新日期: 2023-09-27 18:16:39

我有一个c++项目,在Visual Studio 2010中创建,需要执行c# DLL中的代码。我使用

#import "pathname'filename.tlb" raw_interfaces_only

指令,以及CoInitialize(NULL)和CoUninitialize() COM调用。

c# DLL是在VS2012中编译的,目标是。net 4.5。

我能够编译并运行这个项目,看起来一切都很好,但是我们注意到一些函数调用的差异。这是通过将完全相同的c++项目加载到VS 2012中,在配置属性中打开/clr,并通过修改记事本中的.vcxproj文件将目标框架(c++项目的)更改为v4.5来验证的。

我想我的问题是:

  1. 为什么c++项目需要以。net框架为目标?c# DLL不应该自己处理吗?(Hans Passant回答)

  2. 为什么可以运行c#。. NET v4.5 DLL通过c++与/clr关闭,并没有任何警告,它可能无法工作?(Hans Passant回答)

  3. 为什么我甚至从函数调用中得到结果?如何可能的c# DLL"工作"(返回一致的结果)?为什么它在针对。net v4.0时返回不同的值?

  4. 是否可以从c++代码中使用c# DLL,而仍然使用VS 2010?或者我是否需要将项目切换到VS 2012?

VS2010中的c++运行一个针对.net 4.5的托管c# DLL

原生c++项目根本不针对。net框架。项目创建向导有点笨拙,当您创建c++项目时,它不会隐藏组合框。

c# DLL需要的框架版本是在注册时确定的。当你勾选"注册COM互操作"构建设置时自动完成,或者通过运行Regasm.exe显式地完成。

本地c++代码可以轻松调用c#代码,这只是你从使用COM中得到的好处。它的基本目的是提供契约和粘合剂,以允许一种语言调用用另一种语言编写的代码。CLR有很好的COM支持,使它看起来很简单。对于c++来说,情况并非如此,编写COM客户端代码通常是令人不愉快的,因为它冗长而且很容易出错。使用raw_interfaces_only是一个错误,您不会获得智能指针内存管理和异常错误处理的好处。