Как я могу использовать C # (управляемый) DLL, которого у меня нет? - PullRequest
8 голосов
/ 10 февраля 2011

Как правильно ссылаться на C # DLL, к которой у меня нет физического доступа?(На самом деле у меня есть DLL, но не все ее зависимости.)

Справочная информация:

На целевом компьютере есть программа и множество взаимозависимых файлов DLL, установленных в C:\FancyProgram.

Мне нужно написать простое приложение, которое будет развернуто на целевом компьютере на C:\SimpleProgram.

Эта простая программа должна будет сделать несколько вызовов в один из файлов dll в C:\FancyProgram.Это управляемая .net DLL

На моей машине для разработки у меня нет есть копия FancyProgram.У меня есть этот один файл DLL, но у меня нет ни одной из его многих зависимостей.Я также не могу связать эту DLL в SimpleProgram.

Какой правильный метод использовать и ссылаться на эту DLL в моем проекте Visual Studio, чтобы мой SimpleProgram правильно компилировался, но загружал DLL во время выполнения изправильное местоположение?

Спасибо

Ответы [ 4 ]

8 голосов
/ 10 февраля 2011

Я рекомендую создать Фасады для той функциональности, которую вы хотите использовать из этой библиотеки. И не используйте (ссылку) это напрямую - разрешите и загрузите его динамически:
C # - правильный способ загрузки сборки, поиска класса и вызова метода ()
Загрузка сборки во время выполнения и создание экземпляра класса

3 голосов
/ 10 февраля 2011

.Net в любом случае сделает позднее связывание. До тех пор, пока вы не будете ссылаться на .dll до тех пор, пока вы действительно не захотите загрузить его, это будет работать.

Просто инкапсулируйте все ссылки (поля, свойства, методы, экземпляры) в отдельный класс или проект и создайте экземпляр только тогда, когда это необходимо. Затем вы можете попытаться поймать ошибку загрузки. Посмотрите окно вывода Visual Studio, когда ваше приложение будет запущено, оно сообщит вам, когда оно пытается загрузить файл .dll.

Вы также можете посмотреть на эти события, чтобы приложение корректно обрабатывало ошибки:

AppDomain.CurrentDomain.AssemblyLoad += ...;
AppDomain.CurrentDomain.AssemblyResolve += ...;
AppDomain.CurrentDomain.UnhandledException += ...;
AppDomain.CurrentDomain.FirstChanceException += ...;

Вы также можете выбрать MEF . Это основа для поздней загрузки / привязки.

1 голос
/ 10 февраля 2011

Возможно, вы захотите взглянуть на детали LoadLibrary, GetProcAddress и Marshal.GetDelegateForFunctionPointer.

Я бы также собрал dll для локального тестирования, с тем же интерфейсом, что и у вашей внешней dll.Сколько функциональности вы добавите, зависит от сложности интерфейса и вашего SimpleProgram.

На мой старый вопрос об импорте внешних библиотек * были получены отличные ответы.

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

Ухххххххххххххх, что ты собираешься делать с этим? Предполагая, что вы поняли, что вам нужно убедиться, что .dll находится в GAC и ссылаться на него таким образом (в идеале) или , .dll должен быть в одном месте на всех компьютерах. Добавьте .dll в ваши ссылки и пометьте его как Copy Local: false, чтобы вы не развернули его. Удачи.

...