使用#C.net 3.5
我知道ILMerge和类似的技术,但我实际上想要使用Jeffrey Richter's suggestions。
将此代码添加到构造函数后,会出现名称空间问题。
Jeffrey Richter的代码:
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仍然是“Un embbeded”,然后我将它们作为参考删除但是当我构建时该程序有错误说:“无法找到类型或命名空间......你是否缺少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();
}
}
}
答案 0 :(得分:3)
将它放在构造函数中,而不是InitializeComponent()。将使用指令添加到主类源代码文件中不是问题。
答案 1 :(得分:3)
根据您问题中的描述,为了回答可能需要的一些事情并不清楚:
基本上,根据我的理解,你有代码试图使用2个程序集中的类。此代码是 static ,这意味着必须在编译时知道类。或者换句话说,您必须引用这两个程序集,以便编译使用其中定义的类型的代码。
当您添加这些程序集作为参考时,我真的不明白出了什么问题。如果困扰你的是你看到它们被复制到 bin / debug 目录中,那么它们仍然不应该阻止它们嵌入到你的主程序集中。因此,要进行测试,您可以尝试从 bin / debug 手动删除它们,或者将它们设置为“copy local = false”。
还有一件事 - 你遇到的提到“使用”和“名称空间”的错误并不是关于命名空间的。此错误意味着编译器找不到所需的类型。这可能是因为你删除了对2个程序集的引用。
答案 2 :(得分:-1)
String resourceName = "AssemblyLoadingAndReflection." + new AssemblyName(args.Name).Name + ".dll";
应更改为:
String resourceName = Application.Current.GetType().Namespace + "." + new AssemblyName(args.Name).Name + ".dll";