2013-12-12 4 views
0

Я еще не нашел этот сценарий, и мне трудно найти решение. У меня есть приложение .Net, пытающееся динамически загружать управляемую C++ dll для выполнения задачи, которая должна возвращать массив объектов Data.Model.Viper. У меня также есть тот точный объект, определенный в моем. Net-коде. Поэтому, когда я вызываю управляемый метод C++, я возвращаю нужные данные, но когда я пытаюсь его использовать, я не могу назвать его Data.Model.Viper. Поскольку он динамически загружен, я не могу найти способ его псевдонимов, и даже если я это сделаю, я не уверен, что могу преобразовать список C++ Data.Model.Viper в список .Net Data.Model.Viper.Тип существует в обеих DLL с динамически загружаемой dll

Кто-нибудь работал через что-то вроде этого? Альтернативные идеи?

+0

Вы говорите, что пространства имен полностью одинаковы? –

+0

Да, управляемая C++ dll использует файл заголовка, который генерируется из веб-службы .NET, поэтому базовые модели данных являются точными копиями. Теперь мне нужно использовать эту управляемую DLL C++ на веб-сайте. – mdutra

+0

Можете ли вы обернуть его в другую сборку, где она будет выставлять один и тот же тип под другим пространством имен или вы можете просто изменить пространство имен вашего дублирующего объекта? –

ответ

2

Это не может работать, введите идентификатор в .NET, чтобы предотвратить это. Сильная DLL Hell контрмера. Тип идентификатора типа - это не просто имя пространства имен и имя типа, но также и сборка, из которой он пришел. Таким образом, у вас есть два отличительных типа Data.Model.Viper, и они вообще не имеют отношения друг к другу. Попытка бросить только создает InvalidCastException.

Вы должны использовать общий тип, который указан в отдельной сборке, на которую ссылаются как ваш основной код, так и ваш сборщик C++/CLI.

0

Конечно, Ханс Пассент прав. Класс определяется не только пространством имён. Вы можете использовать шаблон дизайна adapter. В .NET dll вы можете создать класс адаптера для переноса обоих ссылочных классов. Затем вы можете использовать класс адаптера, в котором вы бы использовали каждый из двух предыдущих классов. В качестве примера вы бы создали класс ViperAdapter, который заменил бы классы .NET и C++ Viper.

Надеюсь, я помог!

0

Так что это не «правильный» ответ, а ответ Ханса Пассана - лучший. Тем не менее, вот что я сделал, потому что мы так близки к выпуску, и потребовалось бы гораздо больше усилий, чтобы все компоненты использовали одну и ту же модель. Я просто xml сериализовал результат, полученный мной из управляемой C++ dll, а затем десериализовал его как список Data.Model.Viper. Это заняло менее 1 секунды, и метод не будет называться сильно, поэтому я считаю, что риск проблем с производительностью должен быть минимальным.

Смежные вопросы