我是编程新手,非常喜欢帮助。我刚刚安装了MahApps.Metro,它看起来非常漂亮和漂亮。但是我没有System.Windows.Interactivity.dll和MahApps.Metro.dll在同一个文件夹中运行该程序,如果我尝试运行它没有那两个DLL它只是..没有打开。有没有办法将这些DLL合并到exe中,或者只是在没有它的情况下运行它?
提前感谢您的帮助!
答案 0 :(得分:1)
您可以使用ILMerge(http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=17630)。
使用ILMerge可以将所有程序集(文件夹中的所有dll)合并到例如一个exe文件中。请参阅此说明:http://research.microsoft.com/en-us/people/mbarnett/ILMerge.aspx
但是,部署所有程序集的问题是什么?我认为这些日子非常普遍。
答案 1 :(得分:0)
如果使用这些程序集,则无法运行应用程序。毕竟,您正在使用仅在这些程序集中的代码,如果除了shutdown之外没有找到所需的代码,您的应用程序应该怎么做?
但是有一种方法可以在你的exe中嵌入程序集,所以你只需要重新分配一个文件。引用的程序集可以作为嵌入式资源添加(将dll添加到项目中并将其"Build Action"
设置为"Embedded Resource"
)并从那里加载。
然后,您需要在当前AppDomain.AssemblyResolve
的AppDomain
事件中自行加载。为此,您需要为此事件添加一个处理程序,如下所示:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
String resourceName =
"YourDefaultNameSpace." + new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
对于WPF应用,您可以覆盖App.OnStartup(在App.xaml.cs
中)并将其添加到其中:
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
// ---- Add the handler code here ----
}
原始来源及更多详情:
Jeffrey Richter: Excerpt #2 from CLR via C#, Third Edition