2016-02-25 9 views
1

У нас есть решение Visual Studio с около 90 проектами. Большинство из них построены для DLL-файлов, некоторые из них написаны на C++, другие - на C#. Проекты взаимодействуют друг с другом через COM. Мы используем tlbexp для генерации TLB-файлов некоторых проектов C# (те, на которые ссылаются в проектах на C++). И мы используем tlbimp для генерации междоменных DLL проектов C++. Я не полностью вникал в эту тему, но я думаю, что файлы interop просто определяют интерфейсы классов C++, чтобы они могли использоваться из других проектов, верно?Какие функции платформы .NET используют ссылку на сборку ссылок?

Теперь возникает вопрос: для обновления всего решения до Visual Studio 2015 и его компиляции с .NET 4.6.1 я проверил результирующие сборки с помощью dotPeek с помощью JetBrains. Я вижу, что все проекты C# корректно используют .NET 4.6.1, сами библиотеки C++ являются родными и не ссылаются ни на .NET. Теперь меня удивил тот факт, что dotPeek сказал мне, что межплатные DLL (которые были результатом проектов на C++) ссылались на .NET 4.0.

После «замечательного» дня попыток сделать их ссылкой .NET 4.6.1 и большим количеством исследований, я, наконец, не нашел способа сделать ссылку interops .NET 4.6.1. Возможно ли это? Моя текущая догадка заключается в том, что все interop DLL генерируются подобно этой ссылке только базовым .NET 4.0, только потому, что она использует ту же среду CLR, что и .NET 4.6.1.

Это правильно? Должно быть возможно выполнить сборки в любой системе, на которой установлена ​​.NET Framework 4.6.1, не так ли?

ответ

4

Вы получаете плохую информацию от dotPeek. Он не говорит вам, как он выяснил, какая версия .NET предназначена. Это может быть специфично для сборки .NET, созданной компилятором. Поскольку он автоматически вставляет в сборку [TargetFramework] attribute, в нем указывается, какую версию .NET вы выбрали при создании проекта.

Но сборка interop не указывает версию .NET, прежде всего потому, что она не генерируется компилятором. Обратите внимание, как вы никогда не указывали версию при запуске Tlbimp.exe. И не может. Все, что dotPeek может понять, это то, что он нацеливается на .NET 4, указанный в формате метаданных. Ни в коем случае это не может быть более конкретным.

И это не имеет значения, поскольку библиотека interop не использует возможности .NET Framework. Единственная точка библиотеки - ваша программа может использовать функции COM-компонента. Поэтому номер версии, о которой сообщает dotPeek, не имеет значения; любая среда .NET 4.x может использовать библиотеку.

У вас нет настоящей проблемы.