【发布时间】:2011-05-20 09:34:38
【问题描述】:
使用#C.net 3.5
我知道 ILMerge 和类似技术,但我实际上想使用 Jeffrey Richter's suggestions。
将此代码添加到构造函数后,命名空间出现问题。
杰弗里·里希特的代码:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
String resourceName = "AssemblyLoadingAndReflection." + 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);
}
};
我将这两个 DLL 设置为“嵌入式资源”并将它们添加为参考,但是当我构建程序时,这两个 dll 仍然“未嵌入”,然后我将它们作为参考删除,但是当我构建时程序有错误提示:“找不到类型或命名空间......您是否缺少 using 指令或程序集引用?”我将两个命名空间添加为 using 指令...,然后我尝试删除两个引用和两个 using 指令,但仍然出现错误。
这是我的代码:
using System.Reflection;
namespace WindowsFormsApplication2
{
public partial class Ndice : Form
{
public Ndice()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
String resourceName = "AssemblyLoadingAndReflection." + 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);
}
};
InitializeComponent();
}
}
}
【问题讨论】:
-
你理解你粘贴的代码吗?它完全符合您的要求。
-
是“AssemblyLoadingAndReflection”。应该改变?如果是这样怎么办?
-
您的原始代码很接近,但里面有硬编码的 exe 名称。请参阅下面的答案