Как объявить тип в DLL импортированных или встроенных ресурсов - PullRequest
1 голос
/ 11 февраля 2012

Я на самом деле ищу решение объединить все DLL и EXE в один файл.

Я задал вопрос здесь:

Какиспользовать загрузку DLL из Embed Resource?

, и я получил предложение, что я могу связать DLL как ресурс встраивания, затем записать файл DLL встраивания в память и использовать DLLImport для импортаDLL.

Я следовал инструкциям здесь:

http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx

и ниже, что я сделал:

[DllImport("System.Data.SQLite.dll")]
public static SQLiteConnection sqLiteConnection1 = new SQLiteConnection();

public Form1()
{
    ResourceExtractor.ExtractResourceToFile("MyApp.System.Data.SQLite.dll", "System.Data.SQLite.dll");
}

public static class ResourceExtractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
        using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
        {
            byte[] b = new byte[s.Length];
            s.Read(b, 0, b.Length);
            fs.Write(b, 0, b.Length);
        }
    }
}

, но Visual Studio сообщает, что этот блок создает ошибку:

[DllImport("System.Data.SQLite.dll")]
public static SQLiteConnection sqLiteConnection1 = new SQLiteConnection();

Ошибка 1 Атрибут 'DllImport' недопустим в этом типе объявления.Он действителен только для объявлений метода.

Как объявить тип внутри этой DLL?

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Атрибут DllImport используется для объявления методов из неуправляемых библиотек DLL.

Поскольку System.Data.SQLite.dll - это управляемая сборка, после сохранения сборки на диск необходимо загрузить ееReflection, что-то вроде:

using System.Data;
...

var assembly = Assembly.LoadFile(@"path\to\System.Data.SQLite.dll");
var type = assembly.GetType("System.Data.SQLite.SQLiteConnection");
IDbConnection connection = (IDbConnection)Activator.CreateInstance(type);

Надеюсь, это поможет.

1 голос
/ 11 февраля 2012

Если вы хотите объединить управляемые сборки и исполняемый файл в один файл, я предлагаю вам посмотреть ILMerge .

Гораздо проще использовать, чем вручную делать вещи с ресурсами.

0 голосов
/ 11 февраля 2012

DllImport только для собственных DLL.

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

ИЛИ

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

ИЛИ

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

При использовании типа из такой сборки см. Эти ссылки (они включают справочный материал И некоторые примеры кода и т. Д.):

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