[英]C# 4.0 Merge .dll assembly with .NET
我决定将我的另一个问题留下来,因为我想到了一个新的想法,使用在此页面上编写的Jeffrey Richter的方法将.dll库合并到我的应用程序中。 所以我将.dll文件添加为嵌入式资源,并将其添加为参考。 然后在Program.cs中(我不知道他发布的代码应该去哪里),我添加了这个:
...
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
_in = args[1];
SingleInstanceController controller = new SingleInstanceController();
controller.Run(args);
AppDomain.CurrentDomain.AssemblyResolve += (sender, argsx) =>
{
String resourceName = "AssemblyLoadingAndReflection." +
new AssemblyName(argsx.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);
}
}
;
我应该将resourceName更改为其他内容吗? 我是否正确添加(在正确的位置)?
现在问题是,它仍然无法找到并加载程序集,我不确定我做错了什么。 任何帮助,将不胜感激。
您的问题与此非常相似: C#:如何将DLL嵌入资源文件中(程序目录中没有dll副本)
基本上,您的AppDomain.AssemblyResolve
事件处理程序未被调用,因为Main
无法编译。 即使它已经编译,附加事件处理程序应该是你在main中做的第一件事。
我对上述问题的回答有一个工作代码示例和解释为什么您的代码不起作用。
使用调试器。 在AssemblyResolve赋值和lambda主体上设置断点。 单步代码。
是的,现在为时已晚。 移动作业。 如果SingleInstanceController在这样的DLL中,那么Main()方法甚至都不会启动。 将该代码移动到单独的帮助器方法中,并为其提供[MethodImpl(MethodImplOptions.Noinlining)]属性。
已经很好地支持在单个文件中分发程序,它不需要任何代码也不需要合并DLL。 还要处理桌面快捷方式,文件关联以及在旧计算机上安装.NET。 它叫做setup.exe
在AppDomain尝试解析引用(即在入口点和第一行)之前挂钩到AssemblyResolve事件。
嵌入的资源名称以应用程序名称开头,后跟资源名称。 例如:ConsoleApplication.Test.dll。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.