2016-09-14 4 views
0

У меня есть приложение, которое полагается на набор сторонних DLL, версия v1.1. Чтобы использовать их, я ссылаюсь на основной, который находится где-то в папке Program Files. Эта библиотека использует другие, установленные в GAC.Привести определенную версию сторонней сборки

Выпущена новая версия сторонних библиотек DLL, v1.2. DLL в папке Program Files заменяется новой версией; в GAC обе версии сосуществуют.

Проблема заключается в том, чтобы получить приложение (скомпилированный с DLL, v1.1), чтобы работать, когда v1.2 установлен, без повторной компиляции, и без изменения файла app.exe.config.

Я поддерживаю DLL; дополнительные ограничения заключаются в том, что в Program Files установлена ​​только последняя версия DLL, а в GAC установлены все другие DLL (все версии сохранены).

Моя проблема заключается в том, что приложение запускается, но в итоге я получаю сообщение об ошибке из-за несовместимости между типами:

Unhandled Exception: System.InvalidCastException: 
[A]ThirdParty.User cannot be cast to [B]ThirdParty.User. 
Type A originates from 'ThirdParty, Version=1.2.0.0, Culture=neutral, PublicKeyToken=XXXX' 
in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\ThirdParty\v4.0_1.2.0.0__XXXX\ThirdParty.dll'. 
Type B originates from 'ThirdParty, Version=1.1.0.0, Culture=neutral, PublicKeyToken=XXXX' 
in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\ThirdPart\v4.0_1.1.0.0__XXXX\ThirdParty.dll'. 

Я не уверен, чтобы понять, как будет выбран v1.2 DLL, я предполагаю, что путь в DLL хранится в приложении, которое, в свою очередь, решает использовать DLL в GAC для этой версии? Я тестирую систему, отличную от той, которая используется для компиляции, но библиотеки DLL находятся в одном месте. Мое понимание из documentation заключается в том, что следует выбрать версию v1.1 в GAC, а не v1.2.

Где моя ошибка? Как я могу это исправить?

Спасибо,

+0

Довольно стандартный DLL Hell. * Как-то * объект v1.2 создан, хотя вы его не нацеливаете. Простой способ найти злодея, сделав v1.2 недоступным, удалите его из GAC. Теперь он должен бомбить, потому что он больше не может найти DLL. Но, скорее всего, вам придется отправить автору сообщение об ошибке. –

+0

@ HansPassant Я поддерживаю этот ад ... – piwi

ответ

0

Я нашел решение в моем конкретном случае, и перечитывая свой вопрос, я понимаю, что я не упомянул, что мой первоначальный DLL действительно полагается на PowerShell инстанции. Здесь я работал над своей проблемой. В моей DLL, я загрузить определенную версию, если в DLL, которая присутствует в GAC, и загрузить его в моей PowerShell Например:

var assembly = Assembly.Load("ThirdParty, Version=1.1.0.0, Culture=neutral, PublicKeyToken=XXXX"); 
var ps = PowerShell.Create(); 
ps.Commands.AddCommand("Import-Module").AddParameter("-Assembly", assembly); 
ps.Invoke(); 
Смежные вопросы