【发布时间】:2019-01-14 06:39:50
【问题描述】:
我有一个 .NET Core 2 控制台应用程序,它正在对在 .NET Framework 4.7.1 上运行的 ASP.NET 网站底层的数据库执行一些维护/升级工作。
控制台应用程序需要读入在 .NET Framework 程序集中声明的类的程序集限定类型名称。它使用Type.GetType("[assembly-qualified name]";
这段代码非常适合内置的 .NET 类型,但是当涉及到我们自己的程序集中定义的类型时,它会引发异常。令人困惑的是,我可以在 .NET Core 控制台应用程序中声明其中一种类型的变量,但我无法实例化引用相同类型的 Type 对象。
例如,这行得通...
var cs = Common.CustomerManagement.Person.CustomerStatus.ApprovedCustomer;
但是这个……
var ct = Type.GetType("Common.CustomerManagement.Person+CustomerStatus, Common, Version=1.0.6793.16016, Culture=neutral, PublicKeyToken=null;");
...抛出异常...
System.IO.FileLoadException:给定的程序集名称或代码库无效。 (HRESULT 异常:0x80131047)
在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔 throwOnError,布尔 ignoreCase,布尔反射,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,布尔 loadTypeFromPartialName,ObjectHandleOnStack 类型,ObjectHandleOnStack keepalive)
在 System.RuntimeTypeHandle.GetTypeByName(字符串名称,布尔 throwOnError,布尔 ignoreCase,布尔反射,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 loadTypeFromPartialName)
在 System.RuntimeType.GetType(字符串类型名称,布尔 throwOnError,布尔忽略大小写,布尔反射,StackCrawlMark 和 stackMark)
在 System.Type.GetType(String typeName)
我意识到在有效的代码中我引用了枚举 on 类型,而在无效的代码中我只引用了类型,但工作代码表明引用的 .NET Framework 程序集可以加载,而非工作代码表明该类型对 .NET Core 控制台应用程序不可用。
【问题讨论】:
-
对您提供的程序集名称不满意。 “1.0.6793.16016”是一个非常丑陋的版本号,当你需要反射工作时,千万不要让构建系统自动增加[AssemblyVersion]。你将不可避免地在你的代码中弄错这个数字。顺便说一句,在 .netcore 项目中遇到的奇怪问题,我猜你是在自己解决这个问题,而不是在 Visual Studio 中使用 Project > Properties > Package。
-
你是对的 - 我发现一旦我从程序集限定名称中删除了版本号,它就被接受了。
-
@HansPassant - 如果您将评论更改为建议的答案,那么我会将其标记为已接受。
-
我只是不知道那个丑陋的版本号是从哪里来的。在您自己的回答中告诉我们。