2011-02-10 4 views
8

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

фона:

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

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

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

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

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

Спасибо

+2

Управляемый (.NET) или неуправляемый dll? –

+0

Управляется. (обновлено. Спасибо.) – nonot1

+0

Из правильного местоположения также будет проблема в управляемом случае, потому что из C: \ SmpleProgram никакие dll не будут загружены из C: \ FancyProgram. Или есть зависимости GAC-ed? Никогда не пытался, если символическая ссылка будет делать трюк (Да: http://weblogs.asp.net/israelio/archive/2011/01/10/how-to-overcome-the-clr-fusion-limitation.aspx) – rene

ответ

0

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

+0

Тестирование будет проводиться на целевой машине. (Это всего лишь небольшая часть кода). DLL будет находиться в точном месте на всех целевых компьютерах. Как сообщить моей программе, чтобы загрузить ее во время выполнения из определенного места? – nonot1

+0

Зная это, я бы пошел с предложением зиотки. – RobertG5

1

Вы можете посмотреть на детали LoadLibrary, GetProcAddress и Marshal.GetDelegateForFunctionPointer.

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

Были некоторые отличные ответы на мои старые question об импорте внешних DLL.

3

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

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

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

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

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

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