我使用EXE项目(azure应用程序的启动任务)使用我的服务堆栈,因为我已将以下服务堆栈的DLL和一些Azure的DLL复制到EXE项目中.
当我构建这个EXE项目时,Azure DLL将与我的EXE捆绑在一起但服务堆栈的DLL不会与EXE捆绑在一起,因为要在任何机器上运行我的EXE,我需要手动复制所有服务堆栈的DLL.
我已经使用了这个服务栈的dll来使用
JsonServiceClient client = new JsonServiceClient(servicepath);
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能将所有这些DLL捆绑到我的EXE中?
我想将一个.NET DLL程序集和一个由VB.NET控制台应用程序项目引用的C#类库项目合并到一个命令行控制台可执行文件中.
我可以从命令行使用ILMerge执行此操作,但我希望将引用程序集和项目的这种合并集成到Visual Studio项目中.从我的阅读中,我了解到我可以通过MSBuild Task或Target执行此操作,只需将其添加到C#/ VB.NET项目文件中,但我找不到具体的示例,因为MSBuild是一个很大的主题.此外,我找到一些将ILMerge命令添加到Post-build事件的引用.
如何将ILMerge集成到Visual Studio(C#/ VB.NET)项目中,这些项目只是MSBuild项目,将所有引用的程序集(copy-local = true)合并到一个程序集中?
这如何与可能的ILMerge.Targets文件绑定?
使用Post-build事件会更好吗?
你使用ILMerge吗?您是否使用ILMerge合并多个程序集以简化dll的部署?ILMerging组装后,您是否在生产中发现了部署/版本控制问题?
我正在寻找一些关于使用ILMerge来减少部署摩擦的建议,如果可能的话.
所以,正如标题所示,我现在有一个VS2010解决方案,里面有大约50个项目.如果我对没有引用的"顶级"项目进行更改,那么VS仍会重建所有50个项目.我正在运行Visual Studio 2010 Ultimate而没有任何附加组件.我正在使用ILMerge将所有项目合并到一个文件中.
我已经通过检查较低级别dll的时间戳来验证这一点,并且看到它们确实已经重建,即使它们的代码没有被触及.
我已阅读所有回复和评论:
但是他们中的大多数只提供卸载项目的建议,以加快构建时间,但没有具体的解决方案.我试图弄清楚为什么VS认为这些依赖项目需要在不修复时进行重建.
我已经打开了'工具>选项>项目和解决方案>构建和运行>仅在运行时构建启动项目和依赖项'但没有任何效果.
此外,如果我只是重建一个只有8个(in)直接依赖项的"中级"项目,那么即使没有调用ILMerge并且没有修改任何依赖项目,它仍会构建所有8个项目.
感谢大家提供的任何见解.
添加
为了测试一些建议,我从头开始创建一个新的WinForms项目.然后我在该解决方案中创建了两个新项目.我将所有代码和资源(不是项目文件)从我的两个"最低级别"项目复制到两个全新的项目中(我通过将资源管理器中的文件和文件夹放到Visual Studio中的项目中来完成此操作).
最低的项目,我们称之为B,没有引用任何其他项目.下一个项目A仅引用了B. 因此,一旦我将所需的.NET和外部程序集引用添加到项目中,那么解决方案就会构建.
然后,我获得了我的新WinForm项目参考A并完成了完整版本.所以ref链是:
WinForm - > A - > B.
然后我只修改了WinForm 并进行了标准构建(F6).和以前一样,Visual Studio重建了所有三个项目.
源文件在项目中的某些系统eleminiation后乙我发现,如果我打消了我Resources.Designer.cs
和Resources.resx
(并评论指出,利用了的代码.Properties.Resources
对这些资源的对象),然后修改的WinForm将不再重建整个解决方案,只会重建WinForm.
添加Resources.resx
和Resources.Designer.cs
返回项目B(但保留引用的代码,以便没有任何东西利用资源)将重新引入完整的构建行为.
要查看我的资源文件是否已损坏,我再次删除它们,然后创建一个新文件(通过Project Properties - > Resources)并重新添加与以前相同的资源,这是一个单独的Excel文件.使用此设置,仍将进行完全重建.
然后我删除了单个资源,但将资源文件保留在项目B中.即使没有添加资源,但资源文件仍在项目中,也会发生完全(不需要的)重建.
看起来只是将资源文件添加到(.NET 3.5)项目中将导致Visual Studio 2010始终重建该项目.这是一个错误或预期/预期的行为?
再次感谢所有人!
我目前正在开发一个我们有很多依赖项目的项目.我想将所有引用的dll编译成.exe,就像使用嵌入式资源一样.我已经尝试过ILMerge但它无法处理.xaml资源.
所以我的问题是:有没有办法将WPF项目与多个依赖项合并为一个.exe?
两个问题:
1)ILMerged程序集中不包含基本.NET程序集
从.NET 3.5/Visual Studio 2008升级到.NET 4/Visual Studio 2010后,我在后期构建中使用ILMerge时遇到问题.我有一个解决方案,其中有几个项目的目标框架设置为".NET Framework 4" .我使用以下ILMerge命令将单个项目DLL合并到一个DLL中:
if not $(ConfigurationName) == Debug
if exist "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/lib:"C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
/lib:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
/keyfile:"$(SolutionDir)$(SolutionName).snk"
/targetplatform:v4
/out:"$(SolutionDir)bin\development\$(SolutionName).dll"
"$(SolutionDir)Connection\$(OutDir)Connection.dll"
...other project DLLs...
/xmldocs
Run Code Online (Sandbox Code Playgroud)
如果我不指定.NET 4框架目录的位置,我会从ILMerge得到"Unresolved assembly reference not allowed:System"错误.如果我不指定MSTest目录的位置,我得到"不允许未解析的程序集引用:Microsoft.VisualStudio.QualityTools.UnitTestFramework"错误.
上面的ILMerge命令工作并生成DLL.但是,当我在另一个.NET 4 C#项目中引用该DLL并尝试使用其中的代码时,我收到以下警告:
无法解析主要引用"MyILMergedDLL",因为它对.NET Framework程序集"mscorlib,Version = 4.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"具有间接依赖性,其版本"4.0.65535.65535"高于版本当前目标框架中的"4.0.0.0".
如果我然后删除该/targetplatform:v4
标志并尝试使用MyILMergedDLL.dll,我收到以下错误:
"System.Xml.Serialization.IXmlSerializable"类型在未引用的程序集中定义.您必须添加对程序集'System.Xml,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用.
看起来我不应该这样做.使用我的MyILMergedDLL.dll API的人不应该添加对它引用的任何库的引用.我怎么能绕过这个?
2)仅在使用合并程序集时出现TypeLoadException
编辑:除此之外,即使我System.Xml
在使用MyILMergedDLL.dll的使用者项目中添加引用,使用MyILMergedDLL.dll中的一些代码也会产生以下异常:
System.TypeLoadException:无法从程序集'MyILMergedDLL,Version = 1.0.1.1,Culture = neutral,PublicKeyToken = …
我正在使用ILMerge来组合使用C#.NET 4编写的9个.NET DLL.问题是ILMerge卡住了,没有错误消息或任何东西.
日志显示ILMerge正确合并所有程序集,然后设置为编写目标程序集.它运行程序集解析器为一堆引用,然后..没有.成功解析System.Configuration后,日志不会显示任何其他内容.
该程序继续使用CPU,但我不知道它是否正在做任何事情.
其他人有类似的经历吗?
在.NET C#工具的构建过程中,我一直在使用ILMerge将程序集合并到一个exe中.
我最近添加了一个新的类库,现在ILMerge失败了.我记得要告诉它合并新的DLL!
它现在给我这个错误,我真的不明白:
ILMerge.Merge:程序集"DataObjects"未正确合并.它仍然在目标程序集中列为外部引用.
我使用"项目"引用完成的所有程序集引用,并且它在过去没有失败.
任何人都可以为我解释这个错误,或建议一个解决方法吗?
由于各种原因,我们使用ilmerge将所有应用程序集合放入一个文件中,因此用户只需处理一个文件.不幸的是,似乎没有办法将.pdb文件与程序集合并.有谁知道解决这个问题的方法?
ilmerge ×10
c# ×7
.net ×4
assemblies ×3
dll ×3
msbuild ×2
c#-4.0 ×1
deployment ×1
exe ×1
merge ×1
servicestack ×1
wpf ×1