我正在为 AssenblyResolve 事件苦苦挣扎一段时间。我搜索了 stackoverflow 并进行了其他谷歌搜索并尝试了所有我认为相关的内容。以下是更接近我的问题的链接(在我看来):
我有一个带有静态方法的 Bootstrapper 类(为了清楚起见,我将删除我们拥有的线程安全代码:
public static void Initialize()
{
AppDomain.CurrentDomain.AssemblyResolve += CustomResolve;
}
private static Assembly CustomResolve(object sender, ResolveEventArgs args)
{
// There is a lot code here but basicall what it does.
// Is determining which architecture the computer is running on and
// extract the correct embedded dll (x86 or x64). The code was based
// on milang on GitHub (https://github.com/milang/P4.net). And it's the same
// purpose we want to be able to load the x86 or x64 version of the perforce dll
// but this time with the officially Perforce supported p4api.net.
// Once the dll is extracted we assign it to the boostrapper
Bootstrapper._p4dnAssembly = Assembly.LoadFile(targetFileName);
// Make sure we can satisfy the requested reference with the embedded assembly (now extracted).
AssemblyName reference = new AssemblyName(args.Name);
if (AssemblyName.ReferenceMatchesDefinition(reference, Bootstrapper._p4dnAssembly.GetName()))
{
return Bootstrapper._p4dnAssembly;
}
}
如果我有一个带有 main 方法和静态构造函数的简单类,我就能使代码工作。静态构造函数只是调用 Boostrapper.Initialize() 方法。之后,我可以使用我的库并且它按预期工作:
public static class Test
{
static Test()
{
Bootstrapper.Initialize();
}
public static void Main()
{
// Using the library here is working fine. The AssemblyResolve event was
// fired (confirmed by a breakpoint in Visual Studio)
}
}
我遇到的问题是是否至少存在一层依赖关系。基本上代码保持不变,但这次我的库代码在另一个库中:
public static class Test
{
static Test()
{
Bootstrapper.Initialize();
}
public static void Main()
{
Class1 myClass = new Class1();
// The following line is using the code of the extracted library, but
// The AssemblyResolve event is not fired (or fired before I register the
// callback) and therefore the library is not found : result
// BadImageFormatException() error could not load libary because one
myClass.Connect();
}
}
听起来我之前提到的链接中的#2 解释了我所看到的,但它不起作用。永远不会命中 AssemblyResove 回调上的 Visual Studio 断点。
知道发生了什么吗?
弗朗西斯