2011-10-17 3 views
2

분리 된 응용 프로그램 도메인에서 클래스의 인스턴스를 가져 오려고 할 때이 오류가 발생합니다.AppDomain.CreateInstanceAndUnwrap 메서드를 사용할 때 "투명한 프록시를 캐스팅 할 수 없습니다"

string assemblyName = Assembly.GetExecutingAssembly().FullName; 
string typeName = "Namespace.ClassName"; 

AppDomainSetup setup = new AppDomainSetup(); 
setup.ApplicationBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
SecurityZone zone = SecurityZone.MyComputer; 

// Set up the Evidence 
Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 
Evidence evidence = new Evidence(baseEvidence); 
evidence.AddAssembly(assemblyName); 
evidence.AddHost(new Zone(zone)); 

AppDomain app = AppDomain.CreateDomain("Processor AppDomain", evidence, setup); 
core = (Core)app.CreateInstanceAndUnwrap(assemblyName, typeName); 

두 클래스 (호출 및 호출) 같은 assemby (COM DLL을)에 입니다 : 여기에 코드입니다.

그렇다면이 예외의 이유는 무엇입니까? 모든 응답 주셔서 감사합니다.

+1

'typeName'은 '코어'유형을 의미합니까? 캐스팅하지 않고'CreateInstanceAndUnwrap()'의 결과를 볼 때 디버거는 무엇을 보여줍니까? – svick

+0

응답 해 주셔서 감사합니다. – Shelest

+0

답장을 보내 주셔서 감사합니다. 'typeName'은 실제로 Core를 참조합니다. 그렇지 않으면'FileNotFoundException' 또는'TypeLoadException' 타입의 다른 예외를 얻습니다. 이 예제의 마지막 문자열을'Object core = app.CreateInstanceAndUnwrap (assemblyName, typeName); '으로 변경하고 디버깅하여 모든 것이 올바르게 진행될 때 - Core 클래스의 필드가 초기화되고 생성자가 호출되고 객체가 반환되었습니다. 그러나이 반환 된 객체는 클래스 호출을위한 유형별로'System.Runtime.Remoting.Proxies .__ TransparentProxy'입니다. 이 객체를 '코어'유형으로 변환 할 수없는 것처럼 보입니다. – Shelest

답변

0

응용 프로그램이 com dll을 어떻게 참조합니까? 이것은 .net dll입니까? 귀하의 응용 프로그램에 의해 프로젝트로 참조되고 또한 com dll로 등록되어있는 경우, 귀하의 응용 프로그램이 dll의 두 개의 다른 사본을 참조 할 가능성이 있습니다.이 경우 귀하의 Core 클래스는 두 개의 개별 클래스로 간주됩니다 클래스를 다른 dll에 있습니다. AssemblyLoad 이벤트를 디버깅하여로드되는 어셈블리의 위치를 ​​확인하기 위해 appdomains AssemblyLoad 이벤트를 연결하는 것을 고려할 수 있습니다.

+0

내 어셈블리는 .Net COM dll이며 C++ 프로젝트에서 사용됩니다. 내가 말했듯이, 두 클래스 (호출과 호출)는 같은 어셈블리에 있습니다. 이 경우 나는 왜 다른 어셈블리가 있을지 이해하지 못한다. 두 클래스 (호출 및 호출)를 디버깅하고 'Assembly.GetExecutingAssembly(). Location'을 실행하면 두 클래스 모두에서 동일한 결과가 반환됩니다. 나는 당신의 생각을 올바르게 이해하기를 바랍니다. – Shelest

+0

dll에 대한 경로를 지정할 수있는 AppDomain.CreateInstanceFromAndUnwrap을 사용해 보시지 않겠습니까? – Kell

관련 문제