在我的.net核心应用程序中有三个构建。
Solution.Models.Customer:
public class Customer : ICustomer
{
public void Get()
{
Console.WriteLine("Message!");
}
}Solution.Interfaces.ICustomer:
public interface ICustomer
{
void Get();
}Solution.Creator.ContainerCreator:
public class ContainerCreator
{
Assembly _assembly;
public void Add(Assembly assembly)
{
_assembly = assembly;
}
public object CreateInstance(Type type)
{
object instance;
var classesInfo = GetClassesInfo();
//classes Info looks for a match in the assembly with the passed parameter.
var result = classesInfo.Where(w => w.ClassType.FullName == type.FullName).FirstOrDefault();
var objectType = result.ClassType;
instance = Activator.CreateInstance(objectType);
return instance;
}
}然后,当我创建一个具有(ICustomer)类型的对象时,它就是成功创建的,但是如果我转换为(Customer)类型,则会出现一个异常--
var files = Directory.GetFiles(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"Solution.Models.dll",
SearchOption.TopDirectoryOnly);
var asm = Assembly.LoadFile(files[0]);
ContainerCreator containerCreator = new ContainerCreator();
containerCreator.Add(asm);
// Success
Customer = (ICustomer)containerCreator.CreateInstance(typeof(Customer));
// System.InvalidCastException
//Customer = (Customer)containerCreator.CreateInstance(typeof(Customer));我做错了什么,怎么才能战胜这个例外呢?
发布于 2018-11-20 03:58:12
注意:我认为OP正在尝试创建某种插件。如果是这样的话,有许多自定义库,我建议您可以使用已经实现的东西,而不是自己创建轮子。
当人们在运行时第一次开始使用程序集时,这是一个非常常见的错误。问题是,您正在使用Assembly.LoadFile将程序集加载到应用程序域中。无需进一步详细说明,即使使用Assembly.LoadFile加载相同的dll,程序集中定义的类型也将被视为不同的类型。让我们说我有集会A
../MyFolder/A.dll
public class MyType;
public class MyAnotherType;
....
var aDll = Assembly.LoadFile("A.dll");
var aDllAgain = Assembly.LoadFile("A.dll");
var myTypeFromADll =aDll.GetType("MyType");
var myTypeFromADllAgain = aDllAgain.GetType("MyType");
//Yes this is of type MyType but since you used LoadFile
//It is of type MyType from a_dll code base
var instanceFromADll = Activator.CreateInstance(myTypeFromADll);
//Yes this is of type MyType but since you used LoadFile
//It is of type MyType from a_dll_again code base
var instanceFromADllAgain = Activator.CreateInstance(myTypeFromADllAgain);因此,您将获得一个InvalidCastException,因为您试图将X类型的实例转换为Y类型。
解决办法很简单。您应该使用Assemly.Load方法,如果不能,那么下一步就是Assembly.LoadFrom。除非你完全知道你在做什么,否则离Assembly.LoadFile远点。
这是一个非常好和详细的解释。最佳实践
https://stackoverflow.com/questions/53379645
复制相似问题