【问题标题】:C++ in VS2010 running a managed C# DLL targeting .NET 4.5VS2010 中的 C++ 运行面向 .NET 4.5 的托管 C# DLL
【发布时间】:2015-10-06 17:25:05
【问题描述】:

我有一个在 Visual Studio 2010 中创建的 C++ 项目,它需要从 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 不应该能够自己处理吗? (由汉斯·帕桑特回答)

  2. 为什么可以在关闭 /clr 的情况下通过 C++ 运行 C#.NET v4.5 DLL,并且没有任何可能无法工作的警告? (由汉斯·帕桑特回答)

  3. 为什么我什至可以从函数调用中得到结果? C# DLL 怎么可能完全“工作”(返回一致的结果)?为什么在面向 .NET v4.0 时返回不同的值?

  4. 是否可以在使用 VS 2010 的同时使用 C++ 代码中的 C# DLL?还是我需要将项目切换到 VS 2012?

提前致谢。

【问题讨论】:

    标签: c# c++ .net visual-studio-2010 visual-studio-2012


    【解决方案1】:

    本机 C++ 项目根本不以 .NET Framework 为目标。项目创建向导有点笨拙,创建C++项目时并没有隐藏组合框。

    C# DLL 需要的框架版本在您注册时确定。当您勾选“Register for COM interop”构建设置时自动完成或通过运行 Regasm.exe 显式完成。

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

    【讨论】:

    • 我认为您回答了前两个问题,非常感谢。 This KB article 只提到 VS 2005,但我想它也应该适用于更新的版本。为什么你认为它说使用 raw_interfaces_only?修改我的代码以删除该指令根本不会改变结果(仍然适用于 CLR 和目标 4.5,如果没有 CLR 和目标 4.0 仍然无法工作)。
    • 因为当您使用 raw_interfaces_only 时,您很可能会跳过 必需的 错误检查。 C# 代码喜欢抛出异常,如果你不编写错误检查代码,那么你就是不知道出了什么问题。并且不知道,你得到的只是“它不起作用”。不是那种你可以在 SO 获得帮助的诊断方法。
    • 我什至没有得到“它不起作用”。我得到了一个有效的(看起来)结果,无论有没有raw_interfaces_only 都可以得到。我知道这是错误的唯一原因是,完全用 C# 进行测试的人得到了不同的结果。
    • 嗯,这缩小了范围。你必须避免依赖精神力量,并提出一个具体的问题。需要代码 sn-p 和结果。
    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多