【问题标题】:Problem reflecting in ASP.net context在 ASP.net 上下文中反映的问题
【发布时间】:2009-04-29 08:27:11
【问题描述】:

我有一个引用外部程序集的 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 程序集在临时 ASP.net 路径(C:\WINDOWS\Microsoft.NET\Framework \v2.0.50727\Temporary ASP.NET Files\root\08c43c8b\3adac8cf\assembly\dl3\eb7a4127\0235ea60_a3c8c901\ReflectionTest.DLL)

感谢 Paul Alexander,我已将代码更改为使用 Assembly.Load 方法,而不是解决问题的 Assembly.LoadFile。

wwilden:我也尝试将接口提取到它自己的程序集中,这也解决了问题。

【问题讨论】:

    标签: asp.net reflection


    【解决方案1】:

    当您使用 LoadFile 时,程序集不会在运行时加载到与其他程序集相同的上下文中,因此 CLR 接口运行时类型不同。您可以在 Suzanne Cook 的Debugging Assembly Load Failures 中阅读更多内容。

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

    【讨论】:

      【解决方案2】:

      您的接口类型在哪里定义?它是否存在于反射的程序集中以及应用程序本身中?然后你实际上有两个不同的接口,即使它们具有相同的命名空间和名称。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          There is an interesting article over at CodeProject 关于这样的情况。你有一个类,它的结构与接口相同,但没有实现接口本身。本文概述了一种动态创建实现所需接口的包装类的方法。这可能对您的情况有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-25
            • 1970-01-01
            • 2011-06-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多