У нас есть решение Visual Studio с около 90 проектами. Большинство из них построены на DLL-файлах, некоторые написаны на C ++, другие на C #. Проекты общаются друг с другом через COM. Мы используем tlbexp для генерации TLB-файлов некоторых проектов C # (тех, на которые ссылаются в проектах C ++). И мы используем tlbimp для генерации DLL взаимодействий проектов C ++. Я не совсем углубился в тему, но я думаю, что файлы взаимодействия просто определяют интерфейсы классов C ++, чтобы их можно было использовать из других проектов, верно?
Теперь вопрос заключается в следующем: чтобы обновить все решение до Visual Studio 2015 и позволить ему скомпилироваться с .NET 4.6.1, я проверил полученные сборки с помощью dotPeek от JetBrains. Я вижу, что все проекты C # правильно используют .NET 4.6.1, сами библиотеки C ++ DLL являются родными и не ссылаются ни на какие .NET. Теперь меня удивил тот факт, что dotPeek сказал мне, что библиотеки взаимодействия (которые были созданы в проектах C ++) ссылаются на .NET 4.0.
После «замечательного» дня попыток сделать их ссылками на .NET 4.6.1 и большого количества исследований, я, наконец, не нашел способа сделать ссылку на взаимодействия .NET 4.6.1. Это вообще возможно? Мое текущее предположение состоит в том, что все взаимодействующие библиотеки DLL, сгенерированные как эта ссылка, просто базовый .NET 4.0, просто потому, что он использует тот же CLR, что и .NET 4.6.1.
Это правильно? Должна быть возможность выполнения сборок в любой системе, в которой установлен .NET Framework 4.6.1, не так ли?
Вы получаете плохую информацию от dotPeek. Он не говорит вам, как он выяснил, на какую версию .NET нацелены. Это может быть специфично для сборки .NET, которая генерируется компилятором. Потому что он автоматически вставляет Атрибут [TargetFramework] в сборке указывается, какую версию .NET вы выбрали при сборке проекта.
Но сборка взаимодействия не определяет версию .NET, в первую очередь потому, что она не генерируется компилятором. Обратите внимание, что вы никогда не указывали версию, когда запускали Tlbimp.exe. И не могу. Все, что может выяснить dotPeek, — это то, что он нацелен на .NET 4, определяемый форматом метаданных. Ни в коем случае это не может быть более конкретным.
И это не имеет значения, поскольку библиотека взаимодействия не использует функции .NET Framework. Единственная особенность библиотеки в том, что ваша программа может использовать функции компонента COM. Так что номер версии, который сообщает dotPeek, просто не имеет значения; любая библиотека .NET 4.x может использовать библиотеку.
У тебя нет настоящей проблемы.
Других решений пока нет …