我通过以下代码加载并获得了一个dll实例:
ApiClass api = new ApiClass(this);
Assembly SampleAssembly = Assembly.LoadFrom(@"C:\plugin1.dll");
Type myType = SampleAssembly.GetTypes()[0];
MethodInfo Method = myType.GetMethod("onRun");
object myInstance = Activator.CreateInstance(myType);
try
{
object retVal = Method.Invoke(myInstance, new object[] { api });
}
这是IApi接口的代码:
namespace PluginEngine
{
public interface IApi
{
void showMessage(string message);
void closeApplication();
void minimizeApplication();
}
}
我刚刚将IApi复制到dll项目并构建它。这是dll的代码:
namespace plugin1
{
public class Class1
{
public void onRun(PluginEngine.IApi apiObject)
{
//PluginEngine.IApi api = (IApi)apiObject;
apiObject.showMessage("Hi there...");
}
}
}
但是当我想调用dll方法时出错:
Object of type 'PluginEngine.ApiClass' cannot be converted to type 'PluginEngine.IApi'
答案 0 :(得分:2)
我刚刚将IApi复制到dll项目
那是你出错的地方,你无法复制界面。您正在与.NET中类型标识的概念进行斗争。像IApi这样的类型的身份不仅仅取决于它的名称,它的组合也很重要。所以你有两个不同的IApi类型,插件中的那个与主机中的类型不匹配。
您需要创建另一个包含主机和插件使用的类型的类库项目。像IApi一样。在主机项目和插件项目中添加对此库项目的引用。现在只有一个 IApi。