如果文件夹?/中没有特定的dll's,则无法运行工具包
本文关键字:工具包 运行 dll 文件夹 如果 | 更新日期: 2023-09-27 18:10:32
我是一个编程新手,希望能得到一些帮助。我刚刚安装了MahApps。地铁,它看起来真的很漂亮。但是如果没有system . windows . interactive . DLL和MahApps.Metro.dll在同一文件夹中,我无法运行程序,如果我尝试在没有这两个DLL的情况下运行它,它只是…不开。有没有一种方法来合并这些DLL的exe或只是运行它没有他们?
提前感谢您的帮助!
您可以使用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
但是你部署所有程序集的问题是什么?我认为这是很常见的。
如果没有使用这些程序集,则无法运行应用程序。毕竟,您使用的代码只存在于这些程序集中,如果应用程序除了关闭之外没有找到所需的代码,该怎么办?
但是有一种方法可以将程序集嵌入到你的exe中,所以你只需要重新分发一个文件。可以将引用的程序集添加为嵌入式资源(将dll添加到项目中并将其"Build Action"
设置为"Embedded Resource"
)并从那里加载。
您需要在当前AppDomain
的AppDomain.AssemblyResolve
事件中自己加载它。为此,您需要向该事件添加一个处理程序,如下所示:
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: CLR via c#第三版节选#2