Как я могу передать ссылочный тип между сборками, ссылающимися на общую DLL? - PullRequest
0 голосов
/ 02 февраля 2011

Высокий уровень: я пытаюсь создать консольное приложение (например, ConsoleApp.exe), которое может выполнять некоторую обработку для любой данной DLL, которая ссылается на определенный тип, определенный в ConsoleApp.exe.

Я решил, может бытьошибочно, что мне понадобится сопутствующая DLL для ConsoleApp, которая содержит тип или типы (например, ConsoleClass), на которые должны ссылаться произвольные библиотеки DLL.Для этого, поскольку я не знаю лучшего способа, у меня есть два проекта в решении ConsoleApp, один - библиотека классов (Proving ConsoleApp.dll), а другой - консольное приложение, которое ссылается на проект библиотеки классов.

Теперь я могу скопировать мой ConsoleApp.dll в другой относительно не связанный проект в отдельном решении (например, OtherApp.dll), сослаться на него и написать метод, который использует экземпляр ConsoleClass какпараметр.

Теперь, чтобы произвольно обработать этот файл OtherApp.dll, ConsoleApp.exe загружает эту сборку, создает соответствующий класс в этой сборке и затем вызывает соответствующий метод в этом экземпляре.Надеемся, что соответствующие строки ниже дают представление о том, как я это делаю:

Assembly.LoadFrom(path_to_OtherApp_dll);
...
var x = (dynamic)Activator.CreateInstance(type_inside_OtherApp_dll);
...
var instance = new ConsoleClass();
x.some_method_call(instance);

В конечном итоге это не удается.Кажется, это потому, что хотя два проекта (ConsoleApp.exe и OtherApp.dll) ссылаются на одну и ту же DLL для определения ConsoleClass, среда выполнения по-прежнему считает их разными типами.

Есть мысли?

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011
  1. Определение общедоступного интерфейса.Поместите его в свой собственный interface.dll.
  2. Ссылка interface.dll в вашем плагине.Пусть основной класс в вашем plugin.dll реализует ваш интерфейс.
  3. Ссылка interface.dll в вашем exe.
  4. Используйте Assembly.Load () или Assembly.LoadFrom (), чтобы загрузить плагин в вашexe.
  5. Используйте CreateInstance () для создания экземпляра класса вашего плагина.
  6. Просто приведите созданный плагин к вашему типу интерфейса.

Так что вам не нужно«динамические» или другие сложные вещи.Просто, иди, шаг за шагом, как я написал, и это будет работать.Удачи.

0 голосов
/ 02 февраля 2011

Да, это произойдет, когда ConsoleApp.dll будет загружен дважды.Один раз основным приложением, снова плагином, используя его локальную копию.Идентификация типа определяется сборкой, из которой он был загружен.

Мне не совсем понятно, как это произошло.Ваше первое оружие - Fuslogvw.exe, установите его для регистрации всех связей.Первое, что нужно сделать, - это проверить проект плагина и задать для свойства «Копировать локально» ссылки ConsoleApp.dll значение «Ложь», чтобы лишняя копия не могла быть случайно использована.папка сборки приложения - это решение, которое никогда не будет проблем, вы можете загрузить их с помощью Assembly.Load ().Или подкаталог с файлом .config, который использует элемент <probing>, чтобы CLR мог их найти.

0 голосов
/ 02 февраля 2011

Что вы, по словам «среды выполнения, считаете, что они другого типа»?установка заканчивается с некоторым исключением ошибки?метод в переменной x получает что-то, что не может распознать или что?

...