C#4.0与.NET合并.dll程序集
我决定离开我的other question,因为我想到了使用Jeffrey Richter编写的this page上的方法将一个.dll库合并到我的应用程序的新想法。所以我将我的.dll文件添加为嵌入式资源,并将其添加为参考。然后在Program.cs的(我不知道他在哪里发布的代码应该去),我添加了这个:C#4.0与.NET合并.dll程序集
...
[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);
}
}
;
我应该资源名称更改为别的东西吗?我是否正确添加了它(在正确的地方)?
现在的问题是,它仍然无法找到并加载程序集,我不知道我做错了什么。任何帮助,将不胜感激。
在AppDomain尝试解析引用(即入口点和第一行)之前挂钩到AssemblyResolve事件。
嵌入式资源名称以应用程序名称后跟资源名称开头。 例如:ConsoleApplication.Test.dll。
使用调试器。在AssemblyResolve赋值和lambda主体上设置断点。单步执行代码。
是的,这太晚了。移动作业。如果SingleInstanceController在这样的DLL中,那么Main()方法甚至不会启动。将该代码移入单独的帮助器方法并为其提供[MethodImpl(MethodImplOptions.Noinlining)]属性。
将程序分布在单个文件中已得到很好的支持,它不需要任何代码或合并DLL。还负责桌面快捷方式,文件关联以及在旧机器上安装.NET。它叫做setup.exe
是的,谢谢你完全无视我的问题。我问为什么我的代码不工作,或者我做错了什么,而不是“我应该使用我的应用程序分发.dll文件”。我有我的理由不分发带有一堆.dll文件的.EXE文件。另外,setup.exe从哪里来?我的应用程序是一个相对较小且便携的应用程序,我甚至不想使用它。 – Iceyoshi 2011-01-09 07:11:24
你的问题非常类似这样的:C#: How to embed DLL into resourcefile (no dll copy in program directory)
基本上,你AppDomain.AssemblyResolve
事件处理程序没有被调用,因为Main
无法编译。即使它编译了,附加事件处理程序应该是你在main中做的第一件事。
我对上述问题的回答有一个工作代码示例,并解释了为什么代码不起作用。
只是好奇;为什么甚至打扰(有效)静态链接一个DLL? – 2011-01-09 06:59:29
因为我不想分发我的程序将用户发现的10-15个文件无用。 – Iceyoshi 2011-01-09 07:12:33
为什么用户在程序文件中进行挖掘?只需将它们安装到一个子目录中并完成它。我的意思是,“DLL”中的“DL”代表你知道的“动态链接”。 – 2011-01-09 08:17:28