2013-07-22 3 views
0

도움이 필요하면 더 많은 리플렉션을 거치지 않고 클래스의 다른 위치에서 사용할 수있는 개체의 인스턴스를 만들고 싶습니다.호출 된 개체에서 메서드 호출

activator 또는 constructorInfo를 통해 개체를 만든 후에는 둘 다 인수를 읽었지만 액티베이터는 예를 들어 더 짧게 사용했습니다. 캐스트해야하지만 작동하지 않습니다. 예를 들어

는 다음에서 서버로 인스턴스를 캐스팅하는 방법을

System.InvalidCastException: [A]Server cannot be cast to [B]Server. 
    Type A originates from 'Shared, Version=0.0.0.0, Culture=neutral,  
    PublicKeyToken=2a032d22a4688508' in the context 
    'LoadFrom' at location 'C:\Program Files\test1\Shared.dll'. 
    Type B originates from 'Shared, Version=0.0.0.0, Culture=neutral, 
    PublicKeyToken=2a032d22a4688508' in the context 'Default' at location . 
    'C:\Program Files\test2\Shared.dll' 

내가 던진 예외에 대한 이유를 이해하지만이 :

Server instance; 

public void A() 
{ 
    Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll"); 
    serverType = loaded.GetType("Server"); 
    object obj = Activator.CreateInstance(serverType, new [] { "test" }); 
    instance = (Server)obj; 
} 

public void B() 
{ 
    instance.startServer(); 
} 

이 예외를 제공합니다 내가 원하는 유형, 즉 동적으로로드 된 DLL?

+0

어셈블리 또는 기타 특정 코드로 Server 클래스로 전송하도록 지정해야합니다. 코드에서 'Server'는'test.dll '의'Server '와 다른가요? 또는 둘 다 같은 유형을 가리 킵니까? –

+0

죄송합니다. 코드 단축을 위해 test.dll을 제거하고 올바른 위치에서로드하려고 시도했습니다. – user1584120

+0

내 질문을 이해하지 못했을 것 같습니다. 코드의 Server가 Shared.dll의 "Server"와 다른가요? 또는 둘 다 같은 유형을 가리 킵니까? –

답변

0

이 행의 경우 유형의 정규화 된 이름을 지정해야합니다.

어셈블리에서이 코드를 실행하면 probabbly 다른 형식 인 Server이 표시되므로 컴파일러는 로컬 모범 사례를 선택하여이 모호성을 해결하려고 시도합니다. NAMESPACE.TYPE_NAME

+0

제 경우에는 동일한 이름 공간을 가지고 있습니다. 정확히 동일한 클래스이고 정확히 동일한 어셈블리에서 다른 위치에 있습니다. 다른 위치에서 dll을 사용해야 할 때 어셈블리 경로를 사용하여 다른 exe를 시작하는 경로를 얻습니다. – user1584120

+0

"다른 위치"란 무엇입니까? – Tigran

+0

동일한 dll이 다른 위치에 있다는 것을 의미합니다. 다른 응용 프로그램 용 플러그인을 만들고 있는데 일부 어셈블리를 공유합니다. – user1584120