我有一个.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(String name,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMarkHandle stackMark,IntPtr pPrivHostBinder,Boolean loadTypeFromPartialName,ObjectHandleOnStack type,ObjectHandleOnStack keepalive)at System.RuntimeTypeHandle.GetTypeByName(String name) ,布尔值throwOnError,布尔值ignoreCase,布尔值reflectionOnly,StackCrawlMark&stackMark,IntPtr pPrivHostBinder,Boolean loadTypeFromPartialName)System.RuntimeType.GetType(String typeName,Boolean throwOnError,Boolean ignoreCase,Boolean reflectionOnly,StackCrawlMark&stackMark)at System.Type.GetType(String typeName) )
我意识到在我工作的代码中我引用了类型和代码中的枚举,它不仅仅引用了类型,但是工作代码显示引用的.NET Framework程序集可以加载而非工作代码表明该类型不适用于.NET Core控制台应用程序 .
1 回答
问题是类型名称是
Type.AssemblyQualifiedName
,其中包含版本号 .这是造成问题的版本号 . 一旦我删除了版本号并将其他信息留在了类型名称中,就可以了 .