включить сборки через код? C # - PullRequest
1 голос
/ 22 декабря 2009

В MSVC я могу написать

#pragma comment(lib, "my.lib");

, который включает my.lib на этапе компоновки. В моем решении у меня есть 2 проекта. Один - это проект класса, другой - мой главный. Как включить в код ссылочную dll вместо добавления ссылки в проект?

Ответы [ 6 ]

4 голосов
/ 22 декабря 2009

Вопреки распространенному мнению, это возможно: -)

Чтобы статически связать сборки .NET, проверьте ILMerge . Это утилита, которая может быть использована для объединения нескольких сборок .NET в одну. Будь то исполняемый файл или DLL.

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

Редактировать: Однако следует отметить, что это не устраняет необходимость ссылаться на библиотеку. Ссылка по-прежнему необходима для того, чтобы скомпилировать ваш код, который зависит от внешних типов. Очень похоже на включение заголовочных файлов в C (++). По умолчанию сборки c # независимы, связывание не включено. Однако упомянутый выше инструмент позволяет вам создать новую сборку с включенными внешними зависимостями.

3 голосов
/ 22 декабря 2009

Насколько я знаю, ты не можешь. Если вам нужен доступ к типу, который включен в сборку без ссылок, вам придется использовать Assembly.Load().

2 голосов
/ 22 декабря 2009

Боюсь, ты не сможешь.

Вы можете динамически загружать сборку с помощью Assembly.Load(...), но затем вы можете использовать отражение, чтобы явно создать каждый тип, который вам нужно использовать.

1 голос
/ 22 декабря 2009

Управляемый код не использует компоновщик. C / C ++ эквивалентом ссылочной сборки является директива #include, которая необходима в C / C ++, чтобы компилятор мог генерировать код для внешнего типа. Точно то же самое в C #, вы не можете использовать внешний тип, если у компилятора нет определения для него. Эталонная сборка поставляет это.

Эквивалент связывания C / C ++ выполняется во время выполнения в управляемой программе. JIT-компилятор загружает сборки по мере необходимости для генерации машинного кода.

Одна вещь, которую вы можете сделать в программе на C #, которую вы не можете сделать в программе на C / C ++, - это использование Reflection. Это позволяет вам вызывать конструктор и вызывать методы типа с именами типов и методов в виде строк. Запустите этот шарик с помощью Assembly.GetType () и методов класса Type. Однако сначала рассмотрим модель плагина с, скажем, пространством имен System.AddIn.

1 голос
/ 22 декабря 2009

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

Assembly.Load () даст вам дескриптор сборки, а затем вы сможете перебирать типы в сборке.

0 голосов
/ 22 декабря 2009

Если вы хотите загрузить сборку во время выполнения, вы можете использовать Assembly.LoadFrom (filePath) . Но тогда вы не будете ссылаться на сборку и не сможете использовать строгую типизацию.

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

...