I'm looking for a open source tool to merge multiple .NET assemblies into a single assembly.
我为log4net日志记录对象的初始化创建了一个包装类,以便更容易在ThreadContext中建立自定义属性.这发生在我已经建立的类库中以及许多其他有用的函数中.为了加入所有各种库,我还使用'/ internalize'开关向ILMerge添加了一个AfterBuild目标.
这种初始化方法的所有引用内由ILMerge针对性库似乎工作就好了.但是,当我在其他地方引用这个合并的库时.我的实现会引发保护级错误.我已经尝试向可选的exclude(/internalize:excludes.txt)文件中添加各种内容,但这似乎不起作用.
示例excludes.txt:
log4net.Config
log4net.ThreadContext
log4net.LogManager
Run Code Online (Sandbox Code Playgroud)
其他人遇到过这个问题吗?
[编辑]:
这是代码:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Logging
{
public static class Log4NetThreadContext
{
public static ILog Initialize(Type declaringType)
{
// Read from configuration
XmlConfigurator.Configure();
// Set Properties
ThreadContext.Properties["ID"] = ...
...
...
...
if(System.Diagnostics.Debugger.IsAttached)
{
// Special debugging logger
return LogManager.GetLogger("DEBUG_MODE");
}
else
{
// Root logger
return LogManager.GetLogger(declaringType);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的代码..
private static readonly Type declaringType =
MethodBase.GetCurrentMethod().DeclaringType;
private static readonly ILog log =
Log4NetThreadContext.Initialize(declaringType);
... …Run Code Online (Sandbox Code Playgroud) 我有一个带有引用的dll的C#解决方案(也是具有相同.Net版本的C#).当我构建解决方案并运行生成的exe,而不合并exe和引用的DLL时,一切正常.
现在我想将这些合并到一个exe中.我运行ILMerge,一切似乎都正常.我尝试执行exe,它似乎运行正常,直到它尝试反序列化引用的DLL中定义的对象.
using (Stream fstream = new FileStream(file_path, FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
return bf.Deserialize(fstream) as ControlledRuleCollection;
// throws unable to find assembly exception
}
Run Code Online (Sandbox Code Playgroud)
可能有一些ILMerge选项我在这里丢失了吗?
我们有一个应用程序,其编译时的结构如下所示:
是否可以在此使用ILMerge?你会怎么做?
resources ilmerge assemblies localization satellite-assembly
我在C#工作.我有一个包含4个项目的小型VS解决方案:
问题是,安装项目会自动将项目#1和#2检测为项目#3的依赖项.当我将第三个项目的主要输出包含到MSI(安装项目)中时,也会自动拖入依赖项.我不想要这个.
我怎么能阻止它?
我尝试指定"排除过滤器",但无法使其工作.无论我尝试什么,依赖项总是被拖入.

我尝试手动修改Setup.vdproj,以删除自动检测到的依赖项目,但是当我在VS中重新加载.vdproj时,自动检测到的依赖项又回来了.
救命?
我试过了:
C:\Windows\System32>ilmerge /target:winexe /out:c:\output.exe c:\MyProgram.exe c:\Microsoft.WindowsAPICodePack.dll
Run Code Online (Sandbox Code Playgroud)
但得到了:
'ilmerge' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?(顺便说一句,是否有更好的方法将dll合并到exe文件中?)
谢谢
我正在尝试将两个程序集合并为一个程序集,它可以很好地工作.然而,当我尝试合并*.pdb文件时,我收到一个错误:
访问路径"F:\ Fentec\Businessplan\trunk\Ausgabe\Debug\modules\Planrechnung\Planrechnung.pdb"被拒绝.
如果我使用/ ndebug选项以跳过合并*.pdb文件,它可以正常工作.但是当然在调试时无法加载符号.起初我想在postbuild事件中调用ILMerge时,Planrechung.pdb正在使用并被锁定.我也尝试关闭VS2010并从命令行调用ILMerge,但结果保持不变.我检查过ProcessExplorer,文件上没有句柄.
这就是我称之为ILMerge的方式:
E:\ XP\Tools\ILMerge\ilmerge /targetplatform:v4,"D:\WINDOWS\Microsoft.NET\Framework\v4.0.30319"/ lib:"F:\ Fentec\Businessplan\trunk\Ausgabe\Debug\bin" /out:Planrechnung.dll"F:\ Fentec\Businessplan\trunk\Ausgabe\Debug\modules\Planrechnung\Planrechnung.dll""F:\ Fentec\Businessplan\trunk\Ausgabe\Debug\modules\Mandantenverwaltung\Mandantenverwaltung.dll"
我错过了什么吗?如果您需要任何其他信息,请询问.
问候,
Skalli
我正在尝试一些探索性的事情:
说我有一个图书馆"coolproject",它有依赖关系one.dll,two.dll和three.dll.
我想用ILMerge到coolproject有机结合起来one.dll,并two.dll但不是three.dll.在合并完成后,我应该coolproject.dll和three.dll.无论我打算使用哪里,coolproject.dll我都必须参考three.dll
这甚至可能吗?每当我尝试它,我得到.Unresolved assembly reference not allowed: three.我省略three.dll了设置"Copy Local"= false.
[编辑]:
执行如下:
ILMerge /targetplatform:v2 /log /internalize /out:bin\coolproject.dll obj\Debug\coolproject.dll C:\Users\Nick\Projects\test\bin\one.dll C:\Users\Nick\Projects\test\bin\two.dll
Run Code Online (Sandbox Code Playgroud) 对于我的生活,我似乎无法让我的.NET 4应用程序与ILMerge正确合并.即使在设置/ targetplatform,/ lib,/ ndebug 并添加自定义ILMerge.exe.config文件之后,输出文件也无法正常工作(它似乎无法"找到"合并的库).
我试过这个,这无济于事.除非我使用配置文件,否则我甚至无法构建它,但是当我这样做时它不起作用.没有配置文件,我一直收到错误消息" 不允许未解析的程序集引用:PresentationFramework ".
以下是我的ILMerge命令用作后期构建事件的当前状态:
ilmerge.exe /out:C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\bin\Release\OrangeNote.exe
/ndebug /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319
/lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319"
/lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
"C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\obj\Release\OrangeNote.exe"
"C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Lucene.Net\src\Lucene.Net\bin\Release\Lucene.Net.dll"
"C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\Ookii.Dialogs\src\Ookii.Dialogs.Wpf\bin\Release\Ookii.Dialogs.Wpf.dll"
"C:\Users\Logan\Development\Projects\OrangeNote\OrangeNote\..\..\..\Libraries\SharpZipLib\bin\ICSharpCode.SharpZipLib.dll"
"C:\Users\Logan\Documents\Visual Studio 2010\Projects\HumanInterfaceProject\HumanInterfaceProject\bin\Release\HipLib.dll"
Run Code Online (Sandbox Code Playgroud)
对我做错了什么的想法?
我在C#中编写了一个项目,它使用了大量的图像,Milk模型和openGL,我想将所有内容打包在一个exe中,这样我就可以将它上传到我的网站了.现在我得到了一个依赖于jpgs等其他文件的exe.我尝试过使用ILMerge但无法使用它.有更简单的解决方案吗?谢谢.
ilmerge ×10
c# ×6
.net-4.0 ×2
assemblies ×2
.net ×1
installation ×1
localization ×1
log4net ×1
mono ×1
resources ×1
wpf ×1