Необходимо получить доступ к статическому свойству класса без добавления зависимости от DLL

#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.