【问题标题】:Which features of .NET framework do interop assemblies reference?互操作程序集引用了 .NET 框架的哪些功能?
【发布时间】:2016-06-08 14:29:46
【问题描述】:

我们有一个包含大约 90 个项目的 Visual Studio 解决方案。它们中的大多数都是针对 DLL 文件构建的,有些是用 C++ 编写的,有些是用 C# 编写的。项目通过 COM 相互通信。我们使用 tlbexp 来生成一些 C# 项目(在 C++ 项目中引用的那些)的 TLB 文件。我们使用 tlbimp 生成 C++ 项目的互操作 DLL。我没有完全深入这个话题,但我认为,互操作文件只是定义了 C++ 类的接口,让它们可以在其他项目中使用,对吗?

现在,问题如下:为了将整个解决方案升级到 Visual Studio 2015 并让它针对 .NET 4.6.1 进行编译,我使用 JetBrains 的 dotPeek 检查了生成的程序集。我可以看到,所有 C# 项目都正确使用 .NET 4.6.1,C++ DLL 本身是本机的,不引用任何 .NET。现在,令我惊讶的是,dotPeek 告诉我,互操作 DLL(由 C++ 项目产生)引用的是 .NET 4.0。

在尝试让他们参考 .NET 4.6.1 和大量研究之后,我终于没有找到任何方法让互操作参考 .NET 4.6.1。这甚至可能吗?我目前的猜测是,所有像这个参考一样生成的互操作 DLL 只是基本的 .NET 4.0,只是因为它使用与 .NET 4.6.1 相同的 CLR。​​

对吗?应该可以在任何安装了 .NET Framework 4.6.1 的系统上执行程序集,不是吗?

【问题讨论】:

    标签: c++ .net interop tlbimp tlbexp


    【解决方案1】:

    您从 dotPeek 获得了错误信息。它没有告诉您它是如何确定目标的 .NET 版本的。它可以特定于由编译器生成的 .NET 程序集。因为它会自动将[TargetFramework] attribute 插入到程序集中,所以它会说明您在构建项目时选择的 .NET 版本。

    但是互操作程序集没有指定 .NET 版本,主要是因为它不是由编译器生成的。请注意您在运行 Tlbimp.exe 时从未指定版本。而且不能。 dotPeek 所能弄清楚的只是它以 .NET 4 为目标,由元数据格式提示。再具体不过了。

    这并不重要,因为互操作库不使用 .NET Framework 功能。该库的唯一要点是您的程序可以使用 COM 组件功能。所以 dotPeek 报告的版本号无关紧要。任何 .NET 4.x 框架都可以使用该库。

    你没有真正的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2018-05-21
      • 2018-05-25
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多