来自作为外部 dll 的程序集的 GetType
本文关键字:程序集 GetType dll 外部 | 更新日期: 2023-09-27 18:35:48
我的解决方案中有 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;
您的代码只会列出正在执行的程序集的类型,换句话说,该代码所在的程序集。
如果要查询其他程序集,则必须专门加载该程序集类型。
例:
var a = AppDomain.CurrentDomain.LoadFrom( assemblyFilename);
如果您在 Web 服务器上并加载程序集,并且该程序集文件名路径是 ''bin 文件夹,则最终将锁定该程序集,这将阻止您通过删除程序集的新版本来更新网站。 您希望获取执行路径并在那里查找程序集名称。 IIS 创建一个临时文件夹,并将所有程序集复制到该文件夹并从该文件夹运行。 这允许您更新生成新应用程序域的源 ''bin。 你不想失去这种能力。
此外,始终使用 AppDomain.CurrentDomain.CreateInstanceAndUnwrap()
通过反射实例化对象。
获取运行时文件夹:
AppDomain.CurrentDomain.BaseDirectory + "/bin"