找到答案后,我关于程序集解析的最后一个问题(AppDomain.CurrentDomain.AssemblyResolve 要求 <AppName>.resources 程序集?)现在我可以在我的程序中嵌入引用程序集,除非这对某些引用不起作用。
首先,我在 Program.cs 的第一个入口处设置了我的程序集解析器
// attach our embedded assembly loader.
AppDomain.CurrentDomain.AssemblyResolve += AssemblyManager.Instance.Resolver;
这是我的实际解析器;
public Assembly Resolver(object sender, ResolveEventArgs args)
{
AssemblyName askedAssembly = new AssemblyName(args.Name);
lock (this)
{
Assembly assembly;
string resourceName = string.Format("Assets.Assemblies.{0}.dll", askedAssembly.Name);
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
if (stream == null)
{
LogManager.Instance.Write(LogMessageTypes.Fatal, string.Format("Can not resolve asked assembly: {0}", askedAssembly.Name));
MessageBox.Show(i18n.CanNotLoadRequiredAssembliesMessage, i18n.CanNotLoadRequiredAssembliesTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(-1);
}
byte[] assemblyData = new byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
assembly = Assembly.Load(assemblyData);
}
LogManager.Instance.Write(LogMessageTypes.Trace, "Loaded embedded assembly: " + askedAssembly.Name);
return assembly;
}
}
现在我的程序引用了这些库程序集。
- Esent.Collections.dll
- Esent.Interop.dll
- HtmlAgilityPack.dll
- Ionic.Zip.Reduced.dll
- System.Windows.Forms.Calendar.dll
- AxInterop.ShockwaveFlashObjects
- Interop.ShockwaveFlashObjects
- irrKlang.NET4.dll
- ikpMP3.dll
- Nini.dll(已解决)
上面有我的解析器;我可以嵌入 Esent.Collections、Esent.Interop、HtmlAgilityPack、Ionic.Zip.Reduced、System.Windows.Forms.Calendar、AxInterop.ShockwaveFlashObjects、Interop.ShockwaveFlashObjects 并在运行时解决这些问题。
问题出现在 irrKlang.NET.4、Nini 和 ShockwaveFlash 程序集中,如果我尝试嵌入这些程序集并尝试在运行时解决它们,我就会遇到问题。
对于 irrKlang,我可以理解这个问题,因为 irrKlang.NET4 程序集引用了我自己无法找到的非托管 ikpMP3.dll。
对于 Nini.dll,实际上我可以嵌入这个程序集并使用运行的 VS 调试/发布配置它工作正常,但是当我从资源管理器自己启动程序时,程序只是拒绝启动(没有错误或任何一点信息)。
任何帮助表示赞赏。
现在更新 ,感谢 Marc Gravell 的回答,我可以加载 Nini.dll。
对于 irrKlang 部分,由于 irrKlang.NET4.dll 是一个托管程序集,它需要 ikpMp3.dll - 一个非托管程序集 - 如果我尝试在运行时解析 irrKlang.NET4.dll,它可以访问其所需的依赖项 ikpMp3。有解决办法吗?