Как использовать загрузку DLL из Embed Resource? - PullRequest
10 голосов
/ 10 февраля 2012

У меня есть DLL >> System.Data.SQLite.dll

Чтобы использовать его обычным способом> просто добавьте его в качестве ссылки и

using System.Data.SQLite;

тогда я могу использовать все функции внутри этой DLL.

Но , я хочу объединить мой app.exe и эту DLLв один файл.Я попытался использовать ILmerge , но не получилось.Как я знаю, ILmerge не может объединить неуправляемую DLL.

Итак, я попробовал другой способ> сделать DLL как встроенный ресурс.Я могу загрузить его как сборку с кодом ниже:

Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApp.System.Data.SQLite.dll");
byte[] ba = null;
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
    int read;
    while ((read = stm.Read(buffer, 0, buffer.Length)) > 0)  
    {
        ms.Write(buffer, 0, read);
    }
    ba = ms.ToArray();
}
Assembly sSQLiteDLL = Assembly.Load(ba);

, но как я собираюсь использовать функции в SQLiteDLL?

Я также попытался добавить DLL в качестве ресурсав свойствах и загрузите его так:

public Form1()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    InitializeComponent();
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    AppDomain domain = (AppDomain)sender;
    if (args.Name.Contains("System_Data_SQLite"))
    {
        return domain.Load(MyApp.Properties.Resources.System_Data_SQLite);
    }
    return null;
}

Выше объяснено, что я получил до сих пор, и я не знаю, что делать дальше, чтобы использовать DLL?Я все еще не могу использовать функции внутри DLL.

Например, когда я набираю это:

SQLiteCommand cmd = new SQLiteCommand();

Visual Studio говорит:

Ошибка21 Не удалось найти имя типа или пространства имен «SQLiteCommand» (отсутствует директива using или ссылка на сборку?)

Можете ли вы поделиться своим пониманием?Спасибо.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Вы можете встраивать сборку и ссылаться на нее (в VS) одновременно ... для того, как вы хотите ее использовать, вам нужно ссылаться на нее! По какой причине вы не ссылаетесь на Ассамблею?

Использование типа из встроенной сборки (управляемой) без ссылки на него немного сложнее, но возможно с использованием Reflection и т. Д. - см. Эти ссылки (они включают справочный материал И некоторые примеры кода и т. Д.):

При встраивании управляемых DLL у вас есть несколько вариантов:

OR

  • используйте какой-нибудь инструмент, например SmartAssembly (коммерческий)
    он может встраиваться и объединяться между прочим (не нужно менять исходный код)

OR

  • кодируйте себя менее чем в 10 строках (бесплатно, но с минимальным изменением исходного кода)
    пометить все необходимые зависимости как «встроенный ресурс» - так они будут включены в EXE-файл ... вам нужно установить обработчик AssemblyResolve, который во время выполнения считывает ресурсы и возвращает необходимые DLL в .NET runtime ...
0 голосов
/ 13 февраля 2012

Это не метод для использования сборок, загруженных в AppDomain.Пожалуйста, прочитайте эту статью: Как: загружать сборки в домен приложения * Короче говоря,

Вы должны вызвать GetMethod () с именем метода (например, SqlCommand) и затем вызвать его через .Invoke () метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...