Сбой клиента .NET при замене зарегистрированного COM .dll новым в той же версии .NET, что и клиент - PullRequest
8 голосов
/ 11 мая 2011

У нас есть старая C / C ++ .dll, которая зарегистрирована COM. У наших клиентов есть как нативные, так и .NET-клиенты, которые используют этот .dll.

Мы создали новый .NET .dll для замены старого, т. Е. Их интерфейс COM идентичен. Мы хотели бы заменить старую .dll без необходимости перекомпиляции или выполнения каких-либо действий для своих клиентов.

Для нативных клиентов нормально работает просто отменить регистрацию старого .dll и зарегистрировать новый (с помощью regasm). Это также работает для некоторых клиентов .NET. Однако в этих случаях и клиент, и новый .dll компилируются с одинаковой версией .NET, которая выдает исключение ниже.

Другими словами, это работает:

.dll is .NET 3.5 -> client is .NET 4.0
.dll is .NET 4.0 -> client is .NET 3.5
.dll is any .NET -> Client is native

Это исключение ниже:

.dll is .NET 4.0 -> client is .NET 4.0
.dll is .NET 3.5 -> client is .NET 3.5

[A] BARAPIXLib.barcom5 нельзя привести к [B] BARAPIXLib.barcom5.

Тип A происходит от «BARAPIXLib, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» в контексте «LoadFrom» в расположении C: \ arkiv \ S_BTW \ BTW \ BARAPIXWebService \ Barapix \ bin \ BARAPIXLib.dll .

Тип B происходит от 'BartrackTest, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = null' в контексте 'По умолчанию' в расположении 'C: \ arkiv \ Bartrack \ BartrackTest \ x86 \ Src \ BartrackTest \ bin \ x86 \ Release \ BartrackTest.exe»."}

Любые идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Это может быть связано с тем, что в случае, когда вы используете ту же версию .net framework, экземпляр, возвращаемый клиенту, больше не является оболочкой COM, а является чистым объектом .Net, поэтому при попытке привести его кCOM-интерфейс это не удается.Есть похожий вопрос здесь .Решение включает использование Primary Interop Assembly .

1 голос
/ 11 мая 2011

Попробуйте отменить регистрацию любой предыдущей версии и убедитесь, что dll находится в той же папке, что и исполняемый файл. Также попробуйте посмотреть, откуда вы загружаете DLL. Я думаю, что вы загружаете его вручную, поэтому посмотрите на адрес, который вы ссылаетесь на неправильную DLL.

...