首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateInstance InvalidCastException

CreateInstance InvalidCastException
EN

Stack Overflow用户
提问于 2018-11-19 17:15:47
回答 1查看 328关注 0票数 1

在我的.net核心应用程序中有三个构建。

Solution.Models.Customer:

代码语言:javascript
复制
public class Customer : ICustomer
{           
    public void Get()
    {
        Console.WriteLine("Message!");
    }
}

Solution.Interfaces.ICustomer:

代码语言:javascript
复制
public interface ICustomer
{
    void Get();
}

Solution.Creator.ContainerCreator:

代码语言:javascript
复制
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)类型,则会出现一个异常--

代码语言:javascript
复制
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));

我做错了什么,怎么才能战胜这个例外呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-20 03:58:12

注意:我认为OP正在尝试创建某种插件。如果是这样的话,有许多自定义库,我建议您可以使用已经实现的东西,而不是自己创建轮子。

当人们在运行时第一次开始使用程序集时,这是一个非常常见的错误。问题是,您正在使用Assembly.LoadFile将程序集加载到应用程序域中。无需进一步详细说明,即使使用Assembly.LoadFile加载相同的dll,程序集中定义的类型也将被视为不同的类型。让我们说我有集会A

代码语言:javascript
复制
../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远点。

这是一个非常好和详细的解释。最佳实践

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53379645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档