2013-06-19 4 views
1

ApplicationBase이있는 AppDomain을 만든 다음이 ApplicationBase 외부의 어셈블리를 도메인으로로드하고 있습니다.ApplicationBase와 AppDomains간에 인스턴스를 전달할 때 예외

CreateInstanceFromAndUnwrap으로 MarshalByRef 형식을 인스턴스화하는 것은 정상적으로 작동하며 사용자 지정 형식의 인스턴스를 인수로 전달할 때까지 해당 형식을 사용할 수도 있습니다. this 인수가 동일한 어셈블리에서 경우에도,이 예외가 :

System.ArgumentException: Object type cannot be converted to target type. 

내가 ApplicationBase을 설정하지 않는 경우 문제가 사라집니다. 그러나 나는 이것을 설정해야한다. 왜 이런 일이 일어나는 걸까요? 이 문제를 어떻게 해결할 수 있습니까? 내가 대신 작동 MarshalByRef의 직렬화 StringHolder을 할 때

using System; 
using System.Linq; 

namespace adtest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomainSetup ads = new AppDomainSetup 
      { 
       ApplicationBase = "C:\\", // just to have it be different. 
       ApplicationName = "test server" 
      }; 

      AppDomain ad = AppDomain.CreateDomain(
       ads.ApplicationName, null, ads); 

      ReverseFactory rf = (ReverseFactory)ad.CreateInstanceFromAndUnwrap(
       typeof(ReverseFactory).Assembly.Location, 
       typeof(ReverseFactory).FullName); 

      string res = rf.Reverse(
       new StringHolder("Hello from Bizarro Domain")); 

      Console.WriteLine(res); 
     } 
    } 

    public class ReverseFactory : MarshalByRefObject 
    { 
     public string Reverse(StringHolder s) 
     { 
      return new string(s.Value.Reverse().ToArray()); 
     } 
    } 

    public class StringHolder : MarshalByRefObject 
    { 
     public string Value { get; set; } 
     public StringHolder(string s) { Value = s; } 
    } 
} 

: 여기에 전체 테스트 케이스이다. 그러나이 실제 테스트보다 훨씬 큰 코드는 직렬화 가능 객체를 사용할 수 없습니다.

답변

1

예제 코드에서 기본 AppDomain (StringHolder)의 프록시 개체를 하위 AppDomain (ReverseFactory)의 프록시 개체에 전달하려는 것으로 알고 있습니다. 동시에 두 AppDomains가 서로 다른 기본 디렉토리를 갖기를 원합니다.

이 작업을 수행하는 한 가지 방법은 어셈블리를 GAC에 설치하는 것입니다. 이 문제를 처리 할 수있는 또 다른 방법이있을 수 있지만, 현재로서는 그것이 나를 벗어납니다.

+0

GAC에 물건을 넣는 것은 문제를 어떻게 해결했는지입니다. –