2012-10-01 10 views
1

나는 각각 인터페이스 IImportCharacter을 구현하는 다른 클래스 라이브러리를 가지고 있습니다. 내 주요 응용 프로그램에서 사용자가 DLL을 선택하고 응용 프로그램은 라이브러리가 인터페이스를 구현하는지 확인한 다음이를 구현하는 라이브러리에서 클래스를 인스턴스화해야합니다. 나는이 작업을 수행하는 반사를 사용하기 위해 노력하고있어하지만 난 점점 계속 :리플렉션을 사용하여 클래스 인스턴스화

유형 'CustomCharacter.Ogre'의 개체를 캐스팅 할 수 없습니다가 'MainGame.IImportCharacter'을 입력합니다.

Assembly assembly = assemblyPath; 
foreach (Type type in assembly.GetTypes()) 
{ 
    IImportCharacter instance = null; 
    if (type.GetInterface("IImportCharacter") != null) 
    { 
     //exception thrown at this line 
     instance = (IImportCharacter)Activator.CreateInstance(type); 
    } 
} 

나는 그렇지 않으면 컴파일러가 IImportCharacter이 무엇인지 모르는 불평, 주요 프로젝트에 같은 IImportCharacter 파일을 복사했습니다. 나는 이것이 동적으로로드되는 것과 같지 않기 때문에 이것이 문제를 일으킬 수 있다고 생각한다. 이 문제를 어떻게 해결할 수 있습니까?

+0

IImportCharacter가 AssemblyResolver에서 확인할 수 있는지, 즉 AppDomain, Path, GAC 등에 있는지 확인 했습니까? 네 번째로 .net 4 이상을 사용하는 경우 MEF를 사용하십시오. 당신은 MS가 이것을 더 일찍 소개하지 않았을까 궁금해 할 것입니다. – Krishna

+4

인터페이스의 인스턴스를 만들 수 없습니다. 인스턴스를 생성하려면 클래스가 있어야합니다. –

+0

이 링크의 도움말과 비슷합니다 http://www.codeproject.com/Articles/32828/Using-Reflection-to-load-unreferenced-assemblies-a 또는 http://www.csharp-examples.net/ reflection-examples/ – MethodMan

답변

3

네, 캐스팅하려는 인터페이스가 같은 이름의 다른 유형이라고 생각합니다. IImportCharacter를 공유 어셈블리로 옮기지 마십시오. 공유 인터페이스는 인터페이스이기 때문에 코드와로드중인 항목 모두에서 참조 할 수 있습니까?

그렇지 않은 경우 동적로드 유형에서 동적으로로드 된 인터페이스와 함께 Convert.ChangeType()을 사용해보십시오.

+0

변환 방법을 시도했지만'Object가 IConvertible을 구현해야 함 '이라는 예외가 있습니다. 공유 어셈블리 방법을 시도 하겠지만 가능하면 추가 어셈블리가 필요하지는 않습니다. – TryNCode

+0

인터페이스를 기본적으로 사용할 수 있기를 원한다면 훨씬 더 깨끗하다고 ​​생각합니다. 그렇지 않으면 리플렉션을 통해서만 인터페이스를 호출 할 수있게되며 훨씬 더 번거로운 작업이됩니다. 어쨌든 인터페이스와 구현을 분리하는 것이 좋습니다. 즉, 인터페이스 메소드에 대해 코드를 직접 작성할 수 있지만 리플렉션을 통해 런타임시 구현에서 여전히 바꿀 수 있음을 의미합니다. – cirrus

+0

고마워, 이것을 위해 공유 어셈블리를 사용할 것이다. – TryNCode

관련 문제