Вопрос по windows, c# – csc.exe ссылка на внешний файл .dll

7

Я пытаюсь сделать простойc# программа с использованиемGrowl C# API.

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

1) Я сохранил свой.dll файл в том же каталоге, что и мой.cs файл. Чем я побежал

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 когда файлы находятся во внешней папке.

Здесьструктура каталогов для 2-го случая.

Ваш Ответ

3   ответа
10

So, my question is what is the correct way to reference .dll file in csc when files are in an external folder.

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

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

@Noob: я считаю, что это может быть вsubdirectory если вы добавляете файл app.config, чтобы указать проверку пути к частному бину, но это только добавляет еще большей сложности. Это всеmuch проще, если все в одном каталоге.
Спасибо за информацию. RanRag
@RamyAlZuhouri: Тогда все должно быть в порядке.
@JonSkeet Что если сборка подписана и уже скопирована в GAC?
Так что я никак не могу сохранить.dll файл во внешней папке и запустить мой.exe простоdouble-clicking Это. Как я понимаю из вашего ответа,.dll файл должен присутствовать в той же папке, что и .exe во время выполнения. RanRag
2

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

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

But  (Цитата из статьи)

An alternative to using /lib is to copy into the working directory any required assemblies; this will allow you to simply pass the assembly name to /reference. You can then delete the assemblies from the working directory. Since the path to the dependent assembly is not specified in the assembly manifest, the application can be started on the target computer and will find and use the assembly in the global assembly cache.

Because the compiler can reference the assembly does not imply the common language runtime will be able to find and load the assembly at runtime. See How the Runtime Locates Assemblies for details on how the runtime searches for referenced assemblies.

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

1

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

Похожие вопросы