Подтвердить что ты не робот

Как сделать мою dll загружаемой только из базы кода?

Мой проект (какой-то процессор обработки) разделен на 2 библиотеки: один с декларациями интерфейса и один с функциональностью. Обычно проект используется внешним проектом Delphi через COM-технологию.

Давайте скажем, что моя программа нарезает фрукты. Внешняя программа delphi создает объект Fruit и заполняет его свойства: weight (int), Name (string) и ProgressUpdater (типа IProgressUpdater, который объявлен во второй dll с интерфейсами). После этого exst-программы создатель Slicer делает Slicer.AddFruit(newFruit) и вызывает Slicer.Slice().

Ничего особенного. В реальной жизни проект delphi - это Outlook addin. Но вот проблема: иногда некоторые дополнения VSTO заставляют Outlook работать в режиме "теневых копий", поэтому при запуске проекта delphi и создании объекта Slicer наша сборка С# будет помещена в папку temp, и сборка будет создана с этим локальным путем. Ну... это все еще не проблема. Но проблема в том, что проект delphi создает newFruit, а затем передает объект ProgressUpdater, в моей сборке Slicer я не могу получить внешний ProgressUpdater: "Возвращаемый аргумент имеет недопустимый тип", но все же может получить поле с простыми типами (вес, имя).

Это происходит только тогда, когда включен режим shadowCopyFiles. Поэтому я предполагаю, что внешние сборки ProgressUpdater и сборка Slicer размещены в разных местах, поэтому их нельзя передать. Мой вопрос: как избежать того, чтобы моя dll была "теневой копией"? Или есть какое-то другое решение?

4b9b3361

Ответ 1

Таким образом, у меня все еще нет ответа на точный вопрос. Но проблема решена (благодаря HansPassant) с помощью GAC, потому что сборки в GAC никогда не будут скопированы теневыми копиями (на самом деле компоновщик всегда будет сначала собирать сборки в GAC, а затем в других местах).

Возможный ответ на вопрос - пойти currentDomain.AssemblyResolve, но я не смог применить это решение к dll, которое содержит только общедоступные интерфейсы (типы). Возможно, это будет подходящее решение для некоторых случаев.

Ответ 2

Вы можете использовать отражение для динамической загрузки DLL из любого местоположения. Если вы можете пойти этим путем, я могу предоставить дополнительный код для загрузки DLL.