Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net程序集加载问题(如果没有对程序集成员的直接引用)_C#_.net_Assemblies - Fatal编程技术网

C# .Net程序集加载问题(如果没有对程序集成员的直接引用)

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(); }

情况如下: 我有两个项目。控制台和类库。控制台应用程序引用类库。 类库中有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();
}
这是一个众所周知的问题。然而,它是没有声明任何大会成员的解决方案吗

提前感谢。

您只需:

  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)?