互操作程序集引用了 .NET Framework 的哪些功能?

Which features of .NET framework do interop assemblies reference?

我们有一个包含大约 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。

在 "wonderful" 天试图让它们引用 .NET 4.6.1 和大量研究之后,我最终没有找到任何方法让互操作引用 .NET 4.6.1。这可能吗?我目前的猜测是,像这样生成的所有互操作 DLL 都只引用基本的 .NET 4.0,只是因为它使用与 .NET 4.6.1 相同的 CLR。​​

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

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

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

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

你没有真正的问题。