Необходим доступ к статическому свойству класса без добавления зависимости DLL - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть класс внутри 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 #?

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

Ответы [ 5 ]

1 голос
/ 08 ноября 2011

Единственные известные мне случаи, когда элементы из какого-либо проекта B встраиваются в какой-то другой проект A, это константы и перечисления.Мне кажется, что .NET-способ решения вашей проблемы - включить ReleasedDatabaseVersions в третий проект.На этот третий проект будут ссылаться как ValidateInstall.exe, так и Database.dll

1 голос
/ 08 ноября 2011

Вы можете использовать ILMerge post-build для встраивания сборки, содержащей класс Database, в ваш exe:

ILMerge - это утилита, которая может использоваться для объединения нескольких .NET сборки в одну сборку.

Страница ILMerge также ссылается на статью Джеффри Рихтера , в которой подробно описывается, как добиться чего-то подобного без с помощью ILMerge.

0 голосов
/ 08 ноября 2011

Добавление ссылки и включение ссылок на встроенный исполняемый файл будет способом гарантировать, что программа будет работать в системах, в которых не установлена ​​DLL, путем включения ее в сборку.

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

0 голосов
/ 08 ноября 2011

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

При использовании «Добавить существующий элемент ...» выберите «Добавить как ссылку» вместо стандартного «Добавить».

0 голосов
/ 08 ноября 2011

Посмотрите на использование атрибута 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;

Теперь я не уверен, принесет ли отражение все функции или нет.Я не использовал этот метод раньше, поэтому я не мог дать вам правильное решение.

...