我有一个引用外部程序集的ASP.net应用程序,我需要动态加载该程序集并发现实现已知接口的任何类型。我遇到的问题是,我所反映的类型与正在运行的同一接口不匹配,因此我无法强制转换它。
示例:
此代码在ASP.net应用程序中运行。
var assembly = Assembly.LoadFile(Path.Combine(HttpRuntime.BinDirectory, "ExternalAssembly.dll"));
var type = assembly.GetExportedTypes().First<Type>(x => x.Name == "AClass"); // AClass implements IAInterface
var reflectedInterface = type.GetInterface(typeof(IAmAInterface).ToString());
if (reflectedInterface != typeof(IAmAInterface))
throw new Exception("This makes me sad"); // This code gets run我能看到的从bin加载的反射接口和从typeof返回的接口之间的唯一区别是,typeof程序集在temp ASP.net path (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET中有一个位置
感谢Paul Alexander,我已经将代码改为使用Assembly.Load方法,而不是Assembly.LoadFile,这解决了这个问题。
wwilden:我也尝试将接口提取到它自己的程序集中,这也解决了这个问题。
发布于 2009-04-29 08:35:48
使用LoadFile时,程序集在运行时不会加载到与其他程序集相同的上下文中,因此CLR接口的运行时类型是不同的。你可以在苏珊娜·库克的Debugging Assembly Load Failures上阅读更多内容。
如果您正在加载的程序集已经在Bin目录中-您可以按名称加载它。您不需要知道确切的路径,因为Bin文件夹已经在程序集探测路径中。
发布于 2009-04-29 08:34:48
您的接口类型在哪里定义?它是否既存在于反射程序集中,也存在于应用程序本身中?那么您实际上就有了两个不同的接口,即使它们具有相同的名称空间和名称。
您需要做的是从反射的程序集中提取接口,并将其放入从反射的程序集和应用程序中引用的另一个程序集中。那么它应该是有效的。
发布于 2009-04-29 08:50:02
除了您的问题之外,如果您有许多要动态加载的程序集,请记住,这些程序集将保留在内存中,直到ASP.NET工作进程重新加载。这可能会影响服务器的性能。
您可以在单独的AppDomain (可能卸载的最小单元)中加载程序集,在该AppDomain中加载使用.NET remoting引用的代理类。完成后,卸载AppDomain。
https://stackoverflow.com/questions/801429
复制相似问题