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

时间:2016-02-25 17:03:09

标签: c++ .net interop tlbimp tlbexp

我们有一个包含约90个项目的Visual Studio解决方案。其中大多数是针对DLL文件构建的,有些是用C ++编写的,有些是用C#编写的。这些项目通过COM相互通信。我们使用tlbexp生成一些C#项目的TLB文件(在C ++项目中引用的项目)。我们使用tlbimp生成C ++项目的互操作DLL。我没有完全深入研究这个主题,但我认为,interop文件只是定义了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和大量研究的“精彩”日之后,我终于找不到任何方法使interops引用.NET 4.6.1。这甚至可能吗?我目前的猜测是,所有像这样引用的互操作DLL只是基本的.NET 4.0,只是因为它使用与.NET 4.6.1相同的CLR。

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

1 个答案:

答案 0 :(得分:4)

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

但是互操作程序集不指定.NET版本,主要是因为它不是由编译器生成的。请注意在运行Tlbimp.exe时从未指定过版本的方式。并且不能。 dotPeek可以理解的是,它以.NET 4为目标,由元数据格式提示。不可能更具体。

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

你没有真正的问题。