- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在找到关于程序集解析 (AppDomain.CurrentDomain.AssemblyResolve asking for a <AppName>.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 Gravell 的回答,我可以加载 Nini.dll。
对于 irrKlang 部分,由于 irrKlang.NET4.dll 是一个托管程序集,它需要 ikpMp3.dll——一个非托管程序集——如果我尝试在运行时解析 irrKlang.NET4.dll,它可以访问其所需的依赖 ikpMp3。有解决办法吗?
最佳答案
这里的一个常见问题是在您有机会注册程序集解析事件之前使用类型。特别要注意的是,系统必须能够在开始运行方法之前对方法进行 JIT,包括 Main()
。
因此,如果您的入口点 (Main()
) 执行事件 Hook 并且与有问题的类型对话,它将尝试解析类型(对于JIT)之前或有机会订阅。
在main中做最小值;将“真实”代码移动到另一个方法,只有在明确订阅事件后才会调用该方法。
例如:
static void Main() {
SubscribeAssemblyResolver();
ExecuteApplication();
}
在极端情况下,您甚至可能需要使用 MethodImplAttribute 来禁用上述方法的内联。
关于c# - CurrentDomain.AssemblyResolve 无法解析 'some' 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981223/
我现在正在为 AssenblyResolve 事件苦苦挣扎一段时间。我搜索了 stackoverflow 并进行了其他谷歌搜索,并尝试了所有我认为相关的内容。以下是更接近我的问题的链接(在我看来):
我需要动态解析从一个类库到另一个类库的程序集引用。类库是从 PowerShell 脚本加载的,因此在可执行文件中查找依赖程序集的默认 .NET 行为直接失败,因为可执行文件本身就是 PowerShel
我真的很奇怪为什么 assemblyResolver 不工作?我也不能用 foreach(deCompressBinaries 中的 byte[] 二进制文件) ApplicationHost.Loa
我有一个应用程序,它在自身内部嵌入(通过 BuildAction:嵌入式资源)引用的程序集(称为 ClassLibrary1)并在 AppDomain.CurrentDomain.AssemblyRe
实际上,我试图在我的解决方案中实现某种“静态链接”程序集。所以我尝试了以下方法: 使用 CopyLocal = false 添加对我的程序集的引用 使用“添加为链接”将 .dll 文件本身添加到我的解
我有两个程序集:App 和 AddOn。 App 引用 AddOn,但 CopyLocal 设置为 false,因为 AddOn 将由 App 动态加载。 这是 AddOn 中的代码: namespa
出于性能原因,我试图将我的程序集放在 GAC 中。它有一些绑定(bind)到 AssemblyResolve 事件的代码。但是,由于 GAC 处理我的程序集,当解析源来自我自己的 GAC 程序集时,不
我目前正在使用以下代码: AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var name = args.Name
我想附加到 AppDomain.AssemblyResolve event在“Windows Store”应用程序中。但是 AppDomain 不存在。 是否有替代方法来获得相同的功能? 最佳答案 在
在我的 ASP.NET 应用程序中,有 MyAssembly.CustomIdentity 类和 .NET 运行时 tries to serialize that class 。在序列化期间,它会抛出
我正在尝试使用 AppDomain.AssemblyResolve 事件来处理异常,同时解析运行时加载的某些 dll 的程序集 (SerializationException for dynamica
我正在尝试使用 CurrentDomain.AssemblyResolve 事件来加载标记为嵌入式资源的 DLL。具体来说,我的问题来自于我试图将程序集用作子类的事实,如下所示: #define BR
我有一个 WPF 应用程序,我订阅了事件 AppDomain.AssemblyResolve (只要运行时没有找到程序集,就会引发此事件),并且我注意到它被多次调用尝试解析 MyAssembly.re
在找到关于程序集解析 (AppDomain.CurrentDomain.AssemblyResolve asking for a .resources assembly?) 的最后一个问题的答案后,我
这个真的让我很生气。开始了: 我的目标是在运行时加载包含嵌入式 aspx、ascx 等的程序集。我还希望不锁定磁盘上的程序集文件,这样我就可以在运行时更新它而不必重新启动应用程序(我知道这将保留以前的
我已经处理了 AssemblyResolve 事件,但我仍然收到 FileNotFoundException。我已经在类型初始值设定项中订阅了事件,并在 Main 方法中调用了 Assembly.Lo
我试图通过将 AppDomain 及其 AssemblyResolve 事件包装在一个类中来自定义程序集解析过程。我的 ClassLoader 的简化版本如下。我遇到的问题是,当事件 Assembly
我正在尝试使用一些解析器来处理解析失败,我发现 AppDomain.CurrentDomain.AssemblyResolve 仅在我使用类似 AppDomain.CurrentDomain.Load
我的情况是 AppDomain.CurrentDomain.AssemblyResolve为已经使用 Assembly.Load(myAssemblyMemStream.ToArray()) 加载到当
我想使用内存从 WCF 加载我的程序集。一切正常 时间: AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Curr
我是一名优秀的程序员,十分优秀!