Пускане на две различни версии на същата dll-ка(реферирана от C# приложение)

+3 гласа
57 прегледа
попитан 2016 април 13 в .NET от Nikoleta.V. (4,090 точки)

Предистория 

Имам 2 софтуера, написани на C#, които използват същата външна dll за телефония. 

Проблем 

Когато deploy-на нова версия на някой от тези софтуери, deploy-вам и нова версия на dll-ката. Така се презаписват референциите към старата, което спира работата на софтуера,тъй като новата dll не е съвместима със старата версия. 

Опити за решение на проблема 

-Deploy-нах новия софтуер с версия на dll-ката,която не иска регистрация. Не работи, защото dll-ката не е strong name. Резултатът от sn: 

    C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools>sn.exe -e "theDll.dll" key 

  Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.17929 Copyright (c) Microsoft Corporation. All rights reserved. 

    theDll.dll does not represent a strongly named assembly 

  • Попитах продавача на dll-ката за версия, която е strong name. Резултатът беше „ъ?“. Dll-ката работи чудесно и не искам да търся нов производител, освен ако не ми се налага. 
  • Да направя dll-ката strong name чрез ildasm: 

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools>ildasm.exe "theDll.dll" /out=theDll.il 

error : 'theDll.dll' has no valid CLR header and cannot be disassembled 

Изглежда тя е unmanaged, и от там е невъзможно да стане strong named(ако не се лъжа). 

  • Използвах SetDllDirectory и LoadLibrary да заредя правилната версия на dll.Това донякъде проработи, поне мога да я заредя от конкретно място без да я регистрирам. Това обаче ми звучи много объркан начин да се прави. 

Въпроси 

  • Някой правил ли го е по начина с LoadLibrary и може ли да потвърди, че работи добре когато трябва да се инстанцират класове? 
  • Някой има ли по-добро решение на проблема? 

1 отговор

+1 глас
отговорени 2016 април 14 от valeri.hristov (7,340 точки)

Тук има добра инструкция как се прави подходящ manifest за unmanaged COM:

https://msdn.microsoft.com/en-us/library/ms973913.aspx

Струва ми се обаче, че има някои неща, които не са покрили:

  • Oleview.exe е един начин да вземеш информацията,която ти трябва за manifest. Възможно е да намериш твоята dll като използваш Object classes-> All objects или чрез File-> View TypeLib.
  • Когато вече имаш manifest файла, достатъчно е да избереш "Add reference" във Visual studio, избираш "Browse" и после COM-manifest-а, който си създал. След това си програмираш все едно, че COM-а е регистриран. VS ще създаде manifest-а за твоята програма.
  • Разбира се трябва да се увериш, че проектът разполага .dll файла и manifest-a му в същата папка като .exe.
коментиран 2016 април 18 от Mihaela.Petrova. (3,020 точки)
Благодаря за отговора :)
...