1

残念ながら、ほとんど文書化されていない既存のコードを使用していますが、ロードするプラグインのメソッドをどのように呼び出すかを理解するのに苦労しています。

現時点での私の目的は、プラグインマネージャーを介してロードされたメソッドの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()コンパイラは、実行前にこれらのメソッドをどのように認識しますか?

編集:

私はまだこれを完全には解決していませんが、「GenericPluginServices」を部分的に反映する「PluginsService」ファイルがありませんでした。このエラーは、現在機能していないプラグインに関連するこのクラスの一部を削除したときに発生した可能性があると思います。ただし、この他のコードスニペットを投稿すると質問に役立つと思いました。

PluginService.csコード GenericPluginServiceコード

4

1 に答える 1

1

Findを返すAvailablePluginので.Instance、タイプはIGenericPluginMasterInterface;です。もしそうなら、確かに; それ.Instance.ReturnLeaNumber()はおそらくうまくいかない...

(ジェネリックスなどを導入せずに)機能する唯一の方法は、.Instance実際に返される場合dynamicです。名前/メソッドを使用すると、実行時にdynamic解決が行われます。コンパイラーは、リフレクション(単純な場合)または(より高度な場合)のいずれかに基づいて、すべての解決をランタイムに延期するなど、非常に慎重に処理します。dynamicIDynamicMetaObjectProvider

ただし、お持ちのコードがコンパイルされたものと一致しない場合は、次のようになります。それが何であったかはわかりません。IMO、最良のオプションは、動作中のdllを入手し、それをリフレクターで調べて、実際に何が行われているか、および使用しているソースコードとどのように異なるかを確認することです。

実際には、厳密に言えば、貼り付けたコードでそれを行うことができますが、が次のように入力された場合に限ります plugdynamicdynamic plug = ...

于 2012-08-03T10:40:08.643 に答える