Вы пытались очистить перед сборкой?
product-> clean product-> build
Единственное Развертывание блока Управляемого и Неуправляемого Кода воскресенье, 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 извлечены в собственные файлы и готовы использовать, как будто Вы развернули их как отдельные файлы. Пока у Вас есть полномочия записи для каталога выполнения, это должно хорошо работать для Вас. По крайней мере, для формирующего прототип кода я думаю, что этот способ единственного развертывания блока довольно удобен.
Обладают!
Попробуйте boxedapp; это позволяет загружать весь DLLs из памяти. Кроме того, кажется, что можно даже встроить время выполнения .NET. Хороший для создания действительно автономных приложений...
Вы попробовали 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 как бы то ни было.
Thinstall является одним решением. Для собственного приложения Windows я предложил бы встроить DLL как двоичный объект ресурса, затем извлекая его во времени выполнения перед необходимостью в нем.
PostBuild из Xenocode может упаковать как управляемые, так и неподключенные в один exe.