C# .Net程序集加载问题(如果没有对程序集成员的直接引用)
情况如下: 我有两个项目。控制台和类库。控制台应用程序引用类库。 类库中有Person类 以下代码在类型变量中返回null:C# .Net程序集加载问题(如果没有对程序集成员的直接引用),c#,.net,assemblies,C#,.net,Assemblies,情况如下: 我有两个项目。控制台和类库。控制台应用程序引用类库。 类库中有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)
{
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();
}
这是一个众所周知的问题。然而,它是没有声明任何大会成员的解决方案吗
提前感谢。您只需:
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();
你可以简单地:
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();
使用Assembly.Load方法加载程序集,然后从中创建类型。使用Assembly.Load方法加载程序集,然后从中创建类型。尝试指定程序集的名称,如:
GetType("LoadTest.Person, nameoftheassemblycontainingperson");
假设您的类人员包含在LoadTest.dll
中,您可以编写:
GetType("LoadTest.Person, LoadTest");
不要忘记手动部署它,因为如果删除引用,则包含人员的程序集不会自动复制到工作应用程序所在的位置。尝试指定程序集的名称,如:
GetType("LoadTest.Person, nameoftheassemblycontainingperson");
假设您的类人员包含在LoadTest.dll
中,您可以编写:
GetType("LoadTest.Person, LoadTest");
不要忘记手动部署它,因为如果删除引用,则包含person的程序集不会自动复制到工作应用程序所在的位置。返回null类型变量的原因是 AppDomain.CurrentDomain.GetAssembly不包含您在项目中添加的引用程序集。这是一个应用程序执行的隔离环境 您需要将类库加载到程序集的AppDomain上下文中。 根据您的示例,将此
AppDomain.CurrentDomain.Load("LoadTest");
您可以在运行时使用
Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies();
它返回null类型变量的原因是 AppDomain.CurrentDomain.GetAssembly不包含您在项目中添加的引用程序集。这是一个应用程序执行的隔离环境 您需要将类库加载到程序集的AppDomain上下文中。 根据您的示例,将此
AppDomain.CurrentDomain.Load("LoadTest");
您可以在运行时使用
Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies();
程序集未加载。您必须先加载它。这是否意味着唯一的解决方案是直接使用CurrentDomain.load加载它?程序集未加载。您必须首先加载它。这是否意味着唯一的解决方案是使用CurrentDomain.load直接加载它?我不能这样做,因为我在运行时不知道类型。您在运行时有什么,一个完全限定类型名(LoadTest.Person)的字符串?我不能这样做,因为我在运行时不知道类型。您在运行时有什么,完全限定类型名称的字符串(LoadTest.Person)?