
> AssemblyResolve is not invoked and FileNotFoundException is thrown during serialization
> Where to handle AssemblyResolve event in a class library?
我有一个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; }} 我能够使代码工作,如果我有一个简单的类与一个主要的方法和静态构造函数.静态构造函数只是调用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断点永远不会被击中.
任何想法发生了什么?
弗朗西斯
解决方法 我知道已经有一段时间了,因为这个问题被提出和回答,但是我想补充一下我的想法(因为我只是浪费了几个小时,也许感谢这个别人不必)问题基本上是这样一个事实:应用程序正在尝试解决在该方法开始时执行方法所需的所有程序集:
static voID main(string[] args){ // <-- here the app trIEs to resolve MyAssembly // and as MyAssembly.Class1 is not found,the app crashes // this next line is never called: AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly); // class contained in an assemnly that we need to resolve MyAssembly.Class1 myClass = new MyAssembly.Class1();} 这就是为什么上面会崩溃的:ResolveAssembly事件处理程序永远不会被调用,因为它从来没有被挂接.
这也是为什么下面的解决方案工作(由OP发布):
static voID main(string[] args){ Initialize(); RealMain();}static voID Initialize(){ AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);}static voID RealMain(){ // <-- here the app trIEs to resolve MyAssembly // class contained in an assemnly that we need to resolve MyAssembly.Class1 myClass = new MyAssembly.Class1(); // and everything is OK} 总结 以上是内存溢出为你收集整理的c# – AssemblyResolve没有为依赖关系触发全部内容,希望文章能够帮你解决c# – AssemblyResolve没有为依赖关系触发所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)