#c# #.net #class #inline
#c# #.net #класс #встроенный
Вопрос:
У меня есть класс внутри DLL ( Database.dll
), который имеет статическое свойство:
public class Database
{
public static int[] ReleasedDatabaseVersions
{
get { return new int[] { 5, 6, 7, 8 }; }
}
}
Я создал автономный исполняемый файл ( ValidateInstall.exe
), к которому необходимо получить доступ ReleasedDatabaseVersions
в Database
классе.
Однако я хочу ValidateInstall.exe
быть полностью независимым от Database.dll
(т. Е. я хочу иметь возможность запускать его на ПК без установленной этой библиотеки DLL).
Встраивание в C сделало бы это очень простым. Возможно ли это в C #?
Я не хочу повторять эти данные в моем исполняемом файле, поскольку это было бы головной болью при обслуживании.
Ответ №1:
Вы могли бы использовать ILMerge post-build для встраивания сборки, содержащей Database
класс, в ваш exe:
ILMerge — это утилита, которая может использоваться для объединения нескольких.Объедините сборки в единую сборку.
Страница ILMerge также ссылается на статью Джеффри Рихтера, в которой подробно описывается, как достичь чего-то подобного без использования ILMerge.
Комментарии:
1. Спасибо — у меня это сработало. В итоге я создал общую библиотеку DLL, как предложил @Corey, а затем использовал
ILMerge
для объединения этой общей библиотеки DLL с исполняемым файлом. Это удалило все зависимости во время выполнения.
Ответ №2:
Единственные известные мне случаи, когда элементы из какого-либо проекта B встраиваются в какой-либо другой проект A, — это consts и enums. Мне кажется, что .СЕТЕВОЙ способ решения вашей проблемы — перенести ReleasedDatabaseVersions в третий проект. На этот третий проект будут ссылаться оба ValidateInstall.exe и Database.dll
Ответ №3:
Вы можете добавить исходный код для Database
класса в качестве ссылки на свой автономный проект, чтобы оба проекта совместно использовали один файл исходного кода.
При использовании «Добавить существующий элемент …» выберите «Добавить как ссылку» вместо стандартного Add.
Ответ №4:
Добавление ссылки и включение ссылок на встроенный исполняемый файл было бы способом гарантировать, что программа запускается в системах, в которых не установлена DLL, путем включения ее в сборку.
Я не могу придумать никакого способа распространения этого приложения без фактического дублирования DLL или статического содержимого
Ответ №5:
Взгляните на использование атрибута DllImport:
http://msdn.microsoft.com/en-us/library/aa984739 (v = VS.71).aspx
ОБНОВЛЕНО Если вы не хотите использовать этот метод поздней привязки, всегда есть класс Assembly.
Assembly a = Assembly.LoadFrom("Database.dll"); // This will throw an error that you can catch if the file does not exist.
Database d = a.CreateInstance("Database") as Database;
Теперь я не уверен, приведет ли отражение ко всем функциям или нет. Я раньше не использовал этот метод, поэтому не смог предложить вам правильное решение.
Комментарии:
1. Это вообще имеет отношение к вопросу?
2. Что ж, это способ добиться поздней привязки к файлу dll.
3. Да, и в OP явно указано, что они не хотят этого делать: «Я хочу
ValidateInstall.exe
быть полностью независимым отDatabase.dll
(т. Е. Я хочу иметь возможность запускать его на ПК без установленной этой библиотеки DLL» .4. Wizetux отметил эту сборку. LoadFrom() выдаст исключение, которое может быть перехвачено, если файл не существует. Вы также можете проверить, существует ли файл, прежде чем пытаться загрузить его. Редактировать: Хотя это нужно будет изменить из базы данных d = … для объекта d = …, и для доступа к членам потребуется отражение.
5. @TheEvilPenguin Правильно, вы можете и должны это сделать, но сборка. LoadFrom() — это единственный способ, которым операционная система сможет загружать сборку во время выполнения, не требуя, чтобы сборка была найдена на самом деле или в системе вообще запускался exe.