Как может C++ окна dll быть объединенным в приложение C# exe?

Вы пытались очистить перед сборкой?

product-> clean product-> build

34
задан Noah 16 September 2008 в 13:38
поделиться

5 ответов

Единственное Развертывание блока Управляемого и Неуправляемого Кода воскресенье, 4 февраля 2007

разработчики.NET любит развертывание XCOPY. И они любят единственные компоненты блока. По крайней мере, я всегда чувствую себя отчасти неудобно, если я должен использовать некоторый компонент, и потребность помнят список файлов, чтобы также включать с основным блоком того компонента. Таким образом, когда я недавно должен был разработать компонент управляемого кода и должен был увеличить его с некоторым неуправляемым кодом от DLL C (спасибо Marcus Heege для помощи мне с этим!), я думал о том, как помочь развернуть два DLLs. Если это было всего двумя блоками, я, возможно, использовал ILmerge для собирания их во всего одном файле. Но этот doesnВґt работает на смешанные компоненты кода с управляемым, а также неуправляемым DLLs.

Так hereВґs, что я придумал для решения:

я включаю любой DLLs, который я хочу развернуть со своим componentВґs основным блоком как встроенные ресурсы. Затем я настроил конструктора класса для извлечения тех DLLs как ниже. Класс ctor называют только однажды в каждом AppDomain так itВґs neglible наверху, я думаю.

namespace MyLib
{
    public class MyClass
    {
        static MyClass()
        {
            ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
            ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
        }

        ...

В этом примере я включал два DLLs как ресурсы, один являющийся неуправляемым кодом DLL, и один являющийся управляемым кодом DLL (только в демонстрационных целях), для показа, как эта техника работает на оба вида кода.

код для извлечения DLLs в собственные файлы прост:

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);
                }
    }
}

Работа с блоком управляемого кода как это совпадает с обычный - почти. Вы ссылаетесь на него (здесь: ManagedService.dll) в Вашем componentВґs основном проекте (здесь: MyLib), но набор Локальное свойство Копии ко лжи. Дополнительно Вы связываетесь в блоке как Существующий Объект и устанавливаете Действие Сборки на Встроенный Ресурс.

Для неуправляемого кода (здесь: UnmanagedService.dll), Вы просто связываетесь в DLL как Существующий Объект и устанавливаете Действие Сборки на Встроенный Ресурс. Для доступа к его функциям используют атрибут DllImport, как обычно, например,

[DllImport("unmanagedservice.dll")] public extern static int Add(int a, int b);

ThatВґs это! Как только Вы создаете первую инстанцию класса со статическим ctor, встроенные DLLs извлечены в собственные файлы и готовы использовать, как будто Вы развернули их как отдельные файлы. Пока у Вас есть полномочия записи для каталога выполнения, это должно хорошо работать для Вас. По крайней мере, для формирующего прототип кода я думаю, что этот способ единственного развертывания блока довольно удобен.

Обладают!

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

18
ответ дан 27 November 2019 в 17:15
поделиться

Попробуйте boxedapp; это позволяет загружать весь DLLs из памяти. Кроме того, кажется, что можно даже встроить время выполнения .NET. Хороший для создания действительно автономных приложений...

3
ответ дан 27 November 2019 в 17:15
поделиться

Вы попробовали ILMerge? http://research.microsoft.com/~mbarnett/ILMerge.aspx

ILMerge является утилитой, которая может использоваться для слияния нескольких блоков.NET в единственный блок. Это в свободном доступе для использования от Инструментов & страница Utilities в Центре разработки Microsoft.NET Framework.

при создании DLL C++ с /clr флаг (весь или частично C++ / CLI), затем он должен работать:

ilmerge /out:Composite.exe MyMainApp.exe Utility.dll

Это не будет работать с обычным (собственным) Windows DLL как бы то ни было.

1
ответ дан 27 November 2019 в 17:15
поделиться

Thinstall является одним решением. Для собственного приложения Windows я предложил бы встроить DLL как двоичный объект ресурса, затем извлекая его во времени выполнения перед необходимостью в нем.

0
ответ дан 27 November 2019 в 17:15
поделиться

PostBuild из Xenocode может упаковать как управляемые, так и неподключенные в один exe.

-2
ответ дан 27 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: