如果没有对程序集成员的直接引用,则会出现程序集加载问题



情况如下:我有两个项目。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的程序集不会自动复制到工作应用的位置。

最新更新