【问题标题】:The given assembly name was invalid Type.GetType() not working给定的程序集名称无效 Type.GetType() 不起作用
【发布时间】:2019-07-24 02:26:29
【问题描述】:

未处理的异常:System.IO.FileLoadException:给定的程序集名称或代码库无效。 (HRESULT 异常:0x80131047)

我在一个包含两个类 Program.csAnotherClass.cs 的简单程序中遇到 C# 异常。我想使用 Program.cs 中的静态 Type.GetType 方法将 AnotherClass 作为一个类作为一个更复杂程序的字符串给出。当我使用以下代码时

class Program
{
    static void Main(string[] args)
    {
        Assembly a = Assembly.GetExecutingAssembly();
        //Console.WriteLine(a.FullName);
        Type t = Type.GetType($"SmallTestingSimulator.{a.FullName}.AnotherClass");
        Console.WriteLine(t.Name);
    }
}

一个空类在不同的文件但相同的命名空间

class AnotherClass {

}

我得到了错误。我该如何在这个项目中为另一个类使用 Type.GetType()?如果不使用程序集,它会给出 NullReferenceException。

相关问题

Type.GetType("namespace.a.b.ClassName") returns null

【问题讨论】:

  • typeof(AnotherClass).AssemblyQualifiedName 获取类型的名称。
  • 在我的其他程序中,我只将类的名称作为字符串

标签: c# .net-assembly


【解决方案1】:

让我们深入研究发生的反射并找出答案:

Console.WriteLine(a.FullName);

ProjectAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null

要弄清楚我们需要发送到Type.GetType() 的内容,我们只需输出我们想要获取的类型的FullName

Console.WriteLine(typeof(AnotherClass).FullName);

应该会输出如下内容:

SmallTestingSimulator.AnotherClass

然后,您获取类型的调用就可以运行了

var t = Type.GetType($"SmallTestingSimulator.AnotherClass");

这应该在大多数情况下都有效,除非你对命名空间/程序集做了一些愚蠢的事情。

【讨论】:

  • 如果“AnotherClass”在文件夹中,这无关紧要,对吗?
  • 那么您的意思是,程序集限定符将 Class 作为 Type 对象返回无关紧要?
  • 正确 - 程序集限定符在那里是不必要的,文件夹无关紧要。唯一会有所不同的是AnotherClass 是否也在另一个命名空间中,在这种情况下需要指定(例如$"SmallTestingSimulator.SubNamespace.AnotherClass")。
猜你喜欢
  • 2010-11-12
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多