首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.net上下文中反映问题

在ASP.net上下文中反映问题
EN

Stack Overflow用户
提问于 2009-04-29 08:27:11
回答 4查看 283关注 0票数 1

我有一个引用外部程序集的ASP.net应用程序,我需要动态加载该程序集并发现实现已知接口的任何类型。我遇到的问题是,我所反映的类型与正在运行的同一接口不匹配,因此我无法强制转换它。

示例:

此代码在ASP.net应用程序中运行。

代码语言:javascript
复制
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:我也尝试将接口提取到它自己的程序集中,这也解决了这个问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-29 08:35:48

使用LoadFile时,程序集在运行时不会加载到与其他程序集相同的上下文中,因此CLR接口的运行时类型是不同的。你可以在苏珊娜·库克的Debugging Assembly Load Failures上阅读更多内容。

如果您正在加载的程序集已经在Bin目录中-您可以按名称加载它。您不需要知道确切的路径,因为Bin文件夹已经在程序集探测路径中。

票数 2
EN

Stack Overflow用户

发布于 2009-04-29 08:34:48

您的接口类型在哪里定义?它是否既存在于反射程序集中,也存在于应用程序本身中?那么您实际上就有了两个不同的接口,即使它们具有相同的名称空间和名称。

您需要做的是从反射的程序集中提取接口,并将其放入从反射的程序集和应用程序中引用的另一个程序集中。那么它应该是有效的。

票数 1
EN

Stack Overflow用户

发布于 2009-04-29 08:50:02

除了您的问题之外,如果您有许多要动态加载的程序集,请记住,这些程序集将保留在内存中,直到ASP.NET工作进程重新加载。这可能会影响服务器的性能。

您可以在单独的AppDomain (可能卸载的最小单元)中加载程序集,在该AppDomain中加载使用.NET remoting引用的代理类。完成后,卸载AppDomain。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/801429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档