Использование.NET-2.0-ориентированной COM DLL в GAC в системе.NET-4-only
Снова привет,
В ответ на мой предыдущий вопрос я пытаюсь максимально совместить написанное на C# расширение Windows Explorer. В частности, мне интересно убедиться, что он работает в среде, в которой установлен.NET 4, а.NET 3.5 и ниже не установлены. Казалось бы, нет проблем, но, видимо, не все так просто...
Есть две проблемы. Во-первых, не ориентированные на.NET-4 сборки не будут загружаться с CLR 4, если они не имеют .config
файл, который указывает <supportedRuntime version="v4.0" />
, Даже пытаясь использовать ngen
на них не получится без этого .config
файл. Но моя DLL идет в GAC. Как мне получить .config
файл там тоже? Другие спрашивали то же самое и пришли к выводу: "Ну, я просто сделаю статический класс настроек вместо этого". Очевидно, я не могу этого сделать...
Вторая проблема: когда я регистрирую свою DLL с regasm.exe
, а затем открыть реестр, чтобы увидеть, что он написал, я вижу RuntimeVersion = v2.0.50727
под своей записью CLSID. Это также предотвращает загрузку DLL. Только после того, как я вручную изменил RuntimeVersion
значение для v4.0.30319
загружает DLL.
Так какого черта я должен заставить моего установщика делать здесь? Для первого я понятия не имею. Во-вторых, я полагаю, мне нужно, чтобы установщик вручную установил в системном реестре RuntimeVersion какую-либо версию.NET? Это кажется слишком странным, чтобы быть правдой...
1 ответ
.Net 2.0 - 3.5 и.Net 4.0 имеет два разных GAC, если я правильно помню.
"Проблема с размером частично решена с помощью установщика.NET 4 (x86 + x64), размер которого составляет 54 МБ, и в который не встроены полные установочные пакеты для предыдущих версий". - http://en.wikipedia.org/wiki/.NET_Framework
Таким образом, если вы устанавливаете.Net 3.5, вы получаете предыдущие версии.Net. Это может сбивать с толку.NET 4.0, который не включает эти предыдущие среды выполнения. Я полагаю, что это означает, что вам нужно установить среду выполнения.Net 3.5 наряду с.Net 4.0, чтобы получить <= .Net 3.5 среды выполнения для установки в GAC.
Я также считаю, что если вы измените RuntimeVersion, вы получите.DLL для установки в неправильный GAC. Было бы интересно, однако, если это работает. Я бы не стал доверять этому в среде реального времени, но это было бы действительно очень интересно.