在找到答案之后,我最后一个关于程序集解析( AppDomain.CurrentDomain.AssemblyResolve asking for a .resources assembly? )的问题,现在我可以将引用程序嵌入到我的程序中,但这在某种程度上不起作用。
首先,我在我的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、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的回答,我可以加载Nini.dll。
对于irrKlang部分,作为irrKlang.NET4.dll是一个托管程序集,它需要ikpMp3.dll --一个非托管程序集--如果我在运行时试图解析irrKlang.NET4.dll,它可以访问它所需的依赖项ikpMp3。有办法解决这个问题吗?
发布于 2011-02-12 23:27:05
这里的一个常见问题是在您有机会注册程序集解决事件之前使用这些类型。特别要注意的是,系统必须能够在开始运行方法(包括Main() )之前对一个方法进行JIT。
因此,如果您的入口点(Main())执行与和挂钩的事件,那么它将尝试在之前解析(对于JIT) 类型,或者有机会订阅。
在main中执行最小值;将"real“代码移到另一个方法,该方法只有在事件被明确订阅后才被调用。
例如:
static void Main() {
SubscribeAssemblyResolver();
ExecuteApplication();
}在极端情况下,您甚至需要使用MethodImplAttribute来禁用上述方法的内联。
https://stackoverflow.com/questions/4981223
复制相似问题