代码之家  ›  专栏  ›  技术社区  ›  gbianchi

动态加载dll到我的程序时出现问题

  •  2
  • gbianchi  · 技术社区  · 17 年前

    我正在尝试向我的程序中添加插件,这看起来不错,只是我无法从dll中转换正确的类型。 我有一个解决方案,上面有几个项目。 接口(公共接口IContryBase)

    在另一个项目中,我为国家“实施”。此dll在运行时加载,使用以下方法:

                Assembly assembly = Assembly.LoadFrom(file);
                //get the class from the assembly
                foreach (Type t in assembly.GetTypes())
                {
    //just for debugging
                    Console.WriteLine(t.FullName);
                }
    
                Type localType = assembly.GetType( "CountryLayers.Local");
                if (localType != null)
                {
                    Country countrydata = new Country();
                    countrydata.ObjectType = localType;
                    countrydata.CountryObject  = Activator.CreateInstance(localType);
                    countrydata.CountryObject2 = (CountryBase) countrydata.CountryObject;
                    countrydata.FileName = file;
                    CountryList.Add(countrydata);
                }
    

    其中Local是定义为公共类Local的类的名称:CountryLayers.CountryBase、CountryLayers.icontrybase

    countrydata只保存指针。CountryObject2被定义为CountryBase(我也尝试过作为IcountryBase)。但它总是返回类型不可转换。

    控制台writeline显示程序集中加载了属于countrylayer的所有类以及本地类。

    所以在这一点上,我不知道错误是因为我所有的东西都在同一个解决方案上,还是因为我使用接口和抽象类的顺序不好。同样,当create instance返回对象时,该对象具有抽象类中定义的所有属性,但没有方法。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    我自己解决。当您使用解决方案编译所有内容时,问题就出现了。这样,它也会在其他类的输出中为接口创建dll。考虑到这一点,我使用一个插件文件夹来保存插件,并设置VS将输出编译到该文件夹。它将派生类以及接口dll和抽象实现dll复制到该文件夹中。因此,它使编译器感到困惑。我取出VS中项目的每个引用(我将它们更改为“已编译”dll的引用),我自己编译每个dll,然后我只将我需要的dll复制到插件文件夹中,然后工作。 无论如何,这个链接给了我一个关于这个问题的提示: Dynamic Loading with Reflection

        2
  •  0
  •   Grzenio    17 年前

    我在过去也经历过类似的情况,当动态加载的dll引用包含基类的dll的不同版本时( CountryBase 在你的情况下,我猜)。