我正在尝试向我的程序添加插件,这看起来不错,只是我无法从 dll 中转换正确的类型。 我有一个包含多个项目的解决方案。 其中一个项目是一个国家层,它实际上拥有一个 CountryBase(定义为公共(public)抽象类 CountryBase:CountryLayers.ICountryBase) 接口(interface)(公共(public)接口(interface) ICountryBase)
在另一个项目上,我有针对国家/地区的“实现”。这个 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 是定义为 public class Local 的类的名称:CountryLayers.CountryBase, CountryLayers.ICountryBase
countrydata 只是保存指针。 CountryObject2 被定义为 CountryBase(我也试过 IcountryBase)。但它总是返回类型不可转换。
控制台写入行显示在程序集中加载了属于 countrylayer 的所有类以及本地类。
所以此时我不知道错误是因为我在同一个解决方案上拥有所有内容,还是问题是我以错误的顺序使用了接口(interface)和抽象类。此外,当创建实例返回对象时,该对象具有抽象类中定义的所有属性,但没有方法。
最佳答案
我自己解决。当您使用该解决方案编译所有内容时,就会出现问题。这样,它也会在其他类的输出中为接口(interface)创建 dll。考虑到这一点,我使用了一个插件文件夹来保存插件,并将 VS 设置为将输出编译到该文件夹。它将派生类连同接口(interface) dll 和抽象实现 dll 一起复制到该文件夹。所以它让编译器感到困惑。我取出 VS 中项目的所有引用(我将它们更改为引用“已编译”dll),我自己编译每个 dll,然后我只将我需要的 dll 复制到插件文件夹,然后工作。 无论如何,这个链接给了我一个关于这个问题的提示: Dynamic Loading with Reflection
关于c# - 将 dll 动态加载到我的程序中时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835551/