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



我们有一个包含大约90个项目的Visual Studio解决方案。它们中的大多数都是根据DLL文件构建的,有些是用C++编写的,有些是用C#编写的。这些项目通过 COM 相互通信。我们使用 tlbexp 生成一些 C# 项目的 TLB 文件(C++项目中引用的项目)。我们使用 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 的任何系统上执行程序集,不是吗?

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

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

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

你没有真正的问题。

最新更新