1

我们有一个包含大约 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 的系统上执行程序集,不是吗?

4

1 回答 1

4

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

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

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

你没有真正的问题。

于 2016-02-25T17:31:33.537 回答