- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要动态解析从一个类库到另一个类库的程序集引用。类库是从 PowerShell 脚本加载的,因此在可执行文件中查找依赖程序集的默认 .NET 行为直接失败,因为可执行文件本身就是 PowerShell。如何使这些依赖程序集引用正确解析/工作?
更详细:
我有两个实用程序库:一个是核心库,另一个是执行一些非常具体的解析任务的库。我想在 PowerShell 脚本中动态加载它们而不是在 GAC 中安装它们。第二个库依赖于第一个。在VS解决方案中,解析库有对核心库的项目引用,Copy Local
= true
。
在使用(此处为 PowerShell)后,我可以从解析库输出 bin (/Debug|/Release) 文件夹中加载和使用这两个库:
[Reflection.Assembly]::LoadFile("C:\...thefile.dll")
但是,无论何时在解析(依赖)库中调用从核心库中调用某些内容的方法,它都无法解析核心程序集。这很……令人沮丧……因为这些文件位于同一个文件夹中。一个或两个是否具有强名称 key 都没有区别。
我现在的解决方法是处理 AssemblyResolve
事件。棘手的事情是弄清楚将它放在类库中的什么位置,因为没有一个入口点总是在任何其他事情之前执行,就像在可执行的 Main()
方法中一样(参见 Is there an equivalent of Application_Start for a class library in c# ).
现在我已经创建了一个静态 Resolver
类,它带有一个静态构造函数,它为 AssemblyResolve
附加了一个处理程序,然后在每个解析类中都有一个静态构造函数它引用静态解析器类,强制执行解析器类的静态构造函数。结果是 AssemblyResolve 事件仅附加一次并使用通用的中央代码进行处理。所以它有效。但我讨厌必须向我所有的解析类添加一个时髦的静态构造函数。
有没有更好的方法来处理这个问题?
最佳答案
我找到了一个遵循“消费者应该解决”模式的解决方案,它适用于 PowerShell 和普通 .NET 应用程序消费者。
想法:
Resolver
类,由消费者直接调用。当 PowerShell 是使用者时,从 PowerShell 调用 Resolver
。 CurrentDomain
。因此,即使事件处理程序附加在某个动态加载的程序集中,当程序集解析在主要消费应用程序中失败时,它仍会被调用。我的 Resolver
版本有:
AssemblyDirectory
可用于选择性地设置要搜索的目录。如果留空,它将使用从 Assembly.GetCallingAssembly().Location
Register()
方法,除了确保已调用静态构造函数外,它实际上什么都不做。PowerShell 代码:
# First, load the assembly with the Resolver class. I actually put it in the same
# core library, but it really doesn't matter where it is. It could even be by itself
# in a dynamically compiled assembly built using the Add-Type commandlet
[Reflection.Assembly]::LoadFile("[an assembly that has the Resolver class].dll")
# Call the Register method to force the static constructor to run if it hasn't already
[mycorp.mylib.Resolver]::Register()
$sourcedir = "C:\foo\bar\..some random dir"
# Set the path to search for unresolved assemblies
[mycorp.mylib.Resolver]::AssemblyDirectory = $sourcedir
# Load the dependent assembly
[Reflection.Assembly]::LoadFile("$sourcedir\myparser.dll")
# Create and use an object from the dependent assembly. When the core assembly
# fails at first to resolve, the Resolver's handler is automatically called,
# and everything is peachy
$encoder = New-Object mycorp.mylib.anamespace.aclass
$result = $encoder.DoStuff( $x, $y, $z ... etc )
如果您想知道如何实际处理 AssemblyResolve 事件,请查看 MSDN 上的文档: AppDomain.AssemblyResolve Event
关于Register-ObjectEvent
:
起初,我尝试直接在 PowerShell 中构建程序集解析器,并使用 Register-ObjectEvent
commandlet 注册它。这可行,但有一个问题:PowerShell 不支持返回值的事件处理程序。 AssemblyResolve 处理程序返回一个 Assembly 对象。这几乎就是他们的全部目的。
关于c# - 在类库中的何处处理 AssemblyResolve 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9099309/
我现在正在为 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
我是一名优秀的程序员,十分优秀!