来自作为外部dll的程序集的GetTypes

时间:2016-02-23 15:59:59

标签: c# reflection asp.net-mvc-5

我的解决方案中有2个项目。我的第一个项目是尝试搜索特定命名空间中的所有类并实现特定的接口。

我的网站运行第一个项目,并将第二个项目作为已编译的dll导入。现在,如果我尝试在我的第一个项目中的命名空间中搜索程序集,那么我没有任何问题,但是当我指向我的第二个项目时,它永远找不到任何东西。这是我的代码:

const string @namespace = "MySecondProject.Models";
var reports = from t in Assembly.GetExecutingAssembly().GetTypes()
                      where t.IsClass && t.Namespace == @namespace && typeof(IMyInterface).IsAssignableFrom(t)
                select t;

我还尝试设置命名空间变量以包含第二个项目名称,因为我知道这可能是通过反射创建对象实例时遇到的问题(之前遇到过)

const string @namespace = "MySecondProject.Models,MySecondProject";

我试图理解为什么我没有得到任何结果以及这样做的正确方法是什么?

我也尝试删除我的界面检查,但我仍然得到相同的结果。

编辑:

以下是未来访问者的工作代码示例:

var assembly = Assembly.Load("MySecondProject");
const string @namespace = "MySecondProject.Models";
var reports = from t in assembly.GetTypes()
                      where t.IsClass && t.Namespace == @namespace && typeof(IMyInterface).IsAssignableFrom(t)
                    select t;

1 个答案:

答案 0 :(得分:3)

您的代码仅列出正在执行的程序集的类型,换句话说就是该代码所在的程序集。

如果要询问其他程序集,则必须专门加载该程序集类型。

示例:

var a = AppDomain.CurrentDomain.LoadFrom( assemblyFilename);

如果您在Web服务器上并加载程序集并且程序集文件名路径是\ bin文件夹,那么您将最终锁定该程序集,这将阻止您通过删除程序集的新版本来更新网站。您想获取执行路径并在那里查找程序集名称。 IIS创建一个临时文件夹并复制那里的所有程序集并从那里运行。这允许您更新生成新应用程序域的source \ bin。你不想失去这种能力。

此外,始终使用AppDomain.CurrentDomain.CreateInstanceAndUnwrap()通过反射实例化对象。

获取运行时文件夹:

AppDomain.CurrentDomain.BaseDirectory + "/bin"