0

我通过以下代码加载并获​​得了一个 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'

4

1 回答 1

2

我刚刚将 IApi 复制到 dll 项目中

那就是你出错的地方,你不能复制界面。您正在与.NET中的类型标识概念作斗争。像 IApi 这样的类型的身份不仅仅取决于它的名称,它来自哪个程序集也很重要。所以你有两种不同的 IApi 类型,插件中的一种与主机中的不匹配。

您需要创建另一个包含宿主和插件使用的类型的类库项目。就像 IAPI。在宿主项目和插件项目中添加对此库项目的引用。现在只有一个IApi。

于 2013-11-14T01:34:38.753 回答