情况如下:我有两个项目。ConsoleApp和类库。控制台应用程序引用类库。类库中有Person类
下面的代码在类型变量中返回null:
static void Main(string[] args)
{
Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => a.GetType("LoadTest.Person", false)).Where(t => t != null).FirstOrDefault();
}
但是,如果我添加直接声明,代码就可以正常工作。
static void Main(string[] args)
{
Person p = null;
Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => a.GetType("LoadTest.Person", false)).Where(t => t != null).FirstOrDefault();
}
这是已知的问题。然而,它是任何解决方案没有声明任何组装成员?
返回null类型变量的原因是getassemblies不包含您在项目中添加的引用程序集。这是应用程序执行的隔离环境。
您需要将类库加载到程序集的AppDomain上下文中。根据您的示例,放置此
AppDomain.CurrentDomain.Load("LoadTest");
,您可以在运行时使用
获取程序集列表。Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies();
您可以简单地:
var personType = typeof(Person)
,它将加载程序集并为您提供所需的类型,但如果出于某种原因需要使用assembly类,请执行以下操作:
var type = Assembly.GetAssembly(typeof(Person)).GetType("LoadTest.Person");
或者,如果您不知道运行时的类型,也不知道DLL的文件名,但您可以确定DLL在工作目录中,您可以这样做:
var type = new DirectoryInfo(Environment.CurrentDirectory).GetFiles("*.dll").Select(f => Assembly.LoadFile(f.FullName)).Select(assembly => assembly.GetType("LoadTest.Person")).FirstOrDefault();
使用汇编。加载方法以加载程序集,然后从中创建类型。
尝试指定程序集的名称,如:
GetType("LoadTest.Person, nameoftheassemblycontainingperson");
假设你的类person包含在LoadTest.dll
中,你可以写:
GetType("LoadTest.Person, LoadTest");
不要忘记手动部署它,因为如果你要删除引用,包含person的程序集不会自动复制到工作应用的位置。