2012-05-23 2 views
5

Я пытаюсь сделать простую программу c#, используя Growl C# API.csc.exe ссылка external .dll file

Я пытался скомпилировать свою программу двумя различными способами:

1) Я держал .dll файл в том же каталоге, что и мой .cs файл. Than I ran

csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs 

Он скомпилирован в порядке и также отлично работает.

2) Теперь я создал каталог в моем текущем рабочем каталоге с именем growl и сохранил все мои .dll ссылки там.

Теперь, когда я пытаюсь скомпилировать его с помощью следующей команды

csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D: 
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs 

Это скомпилированная нормально, но когда я попытался запустить его место нижеуказанного исключения.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n 
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified. 
at GrowlNotification.Program.Main(String[] args) 

Итак, мой вопрос, что это правильный способ ссылки .dll файла в csc, когда файлы находятся в папке внешней.

Вот directory structure для 2-го корпуса.

ответ

9

Итак, мой вопрос - это правильный способ ссылки .dll-файла в csc, когда файлы находятся во внешней папке.

Вы уже ссылаетесь на них по адресу build время. Вам просто нужно сделать их доступными в исполнении времени, но копируя их в тот же каталог, что и исполняемый файл, когда вы хотите его запустить.

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

+0

Так что я не могу хранить файл '.dll' во внешней папке и запускать свой' .exe' просто путем двойного щелчка. Как я понимаю из вашего ответа, файл '.dll' должен присутствовать в той же папке, что и .exe во время выполнения. – RanRag

+0

@Noob: Я считаю, что он может быть в * поддиректории *, если вы добавите файл app.config, чтобы указать собственное исследование пути к пробелу, но это просто добавляет еще большую сложность. Это все * намного проще, если все в одном каталоге. –

+0

Спасибо за информацию. – RanRag

1

Вы можете добавить их, используя ключи командной строки/lib и/reference при компиляции.

http://msdn.microsoft.com/en-us/library/s5bac5fx.aspx

Но (цитата из статьи)

Альтернативой использованию/LIB, чтобы скопировать в рабочую директорию любые необходимые сборками; это позволит вам просто передать сборку имя/ссылка. Затем вы можете удалить сборки из рабочего каталога . Поскольку путь к зависимой сборке не равен , указанному в манифесте сборки, приложение можно запустить на целевом компьютере и найти и использовать сборку в глобальном кэше сборки .

Поскольку компилятор может ссылаться на сборку, это не означает, что общий язык выполнения сможет найти и загрузить сборку на этапе . См. Раздел «Как Runtime Locates Assemblies» для получения подробной информации о том, как среда выполнения выполняет поиск ссылочных сборок.

так ответ Джона Скита лучше. (Я просто добавляю это, чтобы предоставить больше информации, чем я мог бы в комментарии, а не как ответ. Ответ Джона - лучший ИМО)

0

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