1

我正在使用一些不幸的是大部分未记录的现有代码,并且我无法理解它如何调用它加载的插件的方法。

我目前的目标只是进入通过插件管理器加载的方法之一,因为它会导致异常。但是,我必须从源代码重建 pluginManager 以获取调试符号,并且当我引用这个新的 DLL 版本时,编译器会抛出武器。

该代码似乎将插件加载到plug.Instance其中,然后像这样访问特定方法plug.Instance.ReturnLeaNumber(); 这个编译器错误是有道理的,因为它不知道插件的详细信息。让我困惑的是编译器是如何知道这些在运行时之前有效的,当时没有插件被初始化。我可以单步调试旧 DLL 现在无法使用的代码!

这是程序加载插件的示例。

plug = GenericServicePlugins.AvailablePlugins.Find(Application.StartupPath + "\\Dlls\\SchoolInterface.dll");
// Compiler doesn't like this next line anymore though
plug.Instance.Initialize(null, null); 

如果我重建的库和以前工作的库之间有任何差异,我无法判断版本与我们的源代码控制中的版本如何匹配。将不胜感激一些关于从哪里开始寻找的建议!

public interface IGenericPluginMasterInterface
{
    String returnName();
    void Initialize(ExceptionStringResources.Translate ExceptionStrings);
    Object ExecuteFunction(String macAddress, bool log, String functionName, LoginCredentials logonCredentials, WebConfiguration webConfig,
                           Int64 dataLinkId, DataLinkParam[] dataLinkParams, String dataName, 
                           DataParam[] dataParams, Object[] additionalParams);
}

PasteBin 上的其余管理器代码

编译器如何在运行前知道这些plug.Instance.Method()方法?

编辑:

我还没有完全解决这个问题,但是我错过了一个“PluginsService”文件,它部分反映了“GenericPluginServices”。我认为这个错误可能是由于我删除了与我正在研究的现已失效的插件相关的此类的部分内容。但是我认为发布这个其他代码片段会帮助解决这个问题。

PluginService.cs 代码 GenericPluginService 代码

4

1 回答 1

1

Find返回AvailablePlugin,所以.Instance是类型IGenericPluginMasterInterface;如果是这样,确实;这.Instance.ReturnLeaNumber()不可能工作...

唯一可行的方法不引入一些泛型等)是如果.Instance实际返回dynamicdynamic名称/方法解析发生在运行时。编译器dynamic非常谨慎地处理,例如基于反射(对于简单情况)或IDynamicMetaObjectProvider(对于更复杂的情况)将所有解决方案推迟到运行时。

但是,如果您拥有的代码与编译的不匹配,那么:我们无法告诉您它是什么。IMO,最好的选择是获取正在工作的dll,并在反射器中查看它以查看它实际在做什么,以及它与您拥有的源代码有何不同。

实际上,严格来说,它仍然可以使用您粘贴的代码执行此操作,但前提plug是键入为dynamic,即 dynamic plug = ...

于 2012-08-03T10:40:08.643 回答