2012-08-03 2 views
1

불행히도 문서화되지 않은 기존 코드를 사용하고 있는데,로드하는 플러그인의 메소드를 호출하는 방법을 이해하는 데 문제가 있습니다.컴파일러는 이러한 Generic Plugin Interface 인스턴스 메소드를 어떻게 처리합니까?

현재 나의 목표는 플러그인 관리자를 통해로드 된 메소드 중 하나에 들어가는 것입니다. 예외가 발생하기 때문입니다. 그러나 디버깅 기호를 얻으려면 소스에서 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); 
} 

Rest of Manager code on PasteBin

어떻게 컴파일러는 실행하기 전에 이러한 plug.Instance.Method() 방법에 대해 알고 있습니까?

편집 :

꽤 아직이 밖으로 일을하지했지만, 부분적으로 "GenericPluginServices"을 반영 내가 놓친는 "PluginsService"파일이 있었다. 이 오류는 필자가 조사한 현재 사용하지 않는 플러그인과 관련된이 클래스의 일부를 제거했을 때 발생할 수 있다고 생각합니다. 그러나 나는이 다른 코드 스 니펫을 게시하는 것이 질문에 도움이 될 것이라고 생각했다.

PluginService.cs code GenericPluginService code

+0

'찾기'가 반환하는 유형은 무엇입니까? 'AvailablePlugin'입니까? –

+0

FindPlugin 메서드는이 "colAvailablePlugins = new Types.AvailablePlugins();"를 반환합니다. – Amicable

+0

'Find'가 아니라'FindPlugin'을 의미했지만 코드에서 찾았습니다 –

답변

1

Find 반환 AvailablePlugin, 그래서 .Instance 유형 IGenericPluginMasterInterface이다; 그렇다면, 정말로; 그 .Instance.ReturnLeaNumber() 가능성이 ... 작동하지 않을 수

.Instance 실제로 dynamic을 반환 (등 일부 제네릭을 도입하지 않고) 일입니다 수 있다면있는 유일한 방법입니다. dynamic을 사용하면 런타임에 이라는 이름/메소드 확인이 발생합니다.. 컴파일러는 반사 (단순한 경우) 또는 IDynamicMetaObjectProvider (더 정교한 경우)을 기반으로 런타임에 대한 모든 해결을 연기하는 것과 같이 매우 신중하게 dynamic을 처리합니다.

그러나 코드가 컴파일 된 것과 일치하지 않으면 우리는 그 코드가 무엇인지 말할 수 없습니다. IMO, 가장 좋은 방법은 dll을 사용하는 것입니다. 반사판에서 dll이 실제로 무엇을하는지, 그리고 가지고있는 소스 코드와 어떻게 다른지 확인하십시오.

사실, 정확히 말하면 붙여 넣은 코드를 그대로 사용할 수 있지만 plugdynamic으로 입력 된 경우에만 가능합니다. 즉dynamic plug = ...

+0

Marc에게 감사를 표합니다. :) – Amicable