2013-11-27 7 views
0

내 응용 프로그램에서 샌드 박스 도메인을 만들고 있는데 바인딩 리디렉션 규칙을 동적으로 정의해야합니다. 그러나 SetConfigurationBytes 메서드를 사용하여 ConfigurationFile 설정이나 원시 XML 데이터를 전달할 수는 없습니다. AppDomainSetup.SetConfigurationBytes()를 작동시키는 방법은 무엇입니까?

나는 구성 데이터가 자식 도메인에 적용되었는지 확인하기 위해 샘플을 만들어 :

public class Sample: MarshalByRefObject 
{ 
    public void DebugPrint() 
    { 
     Debug.WriteLine("====================================="); 
     Debug.Print("Reading config: =====|{0}|=====", ConfigurationManager.AppSettings["MyData"]); 
     Debug.WriteLine("====================================="); 
    } 
} 

업데이트 첫 번째 문제에 :

var configData = 
@"<?xml version='1.0' encoding='utf-8' ?> 
<configuration> 
    <appSettings> 
    <add key='MyData' value='CUSTOM'/> 
    </appSettings> 
</configuration>"; 
var setup = new AppDomainSetup { 
ApplicationBase = runtimeAssembliesPath // ,ConfigurationFile = configFilePath 
       }; 
setup.SetConfigurationBytes(Encoding.UTF8.GetBytes(configData)); 
var sandbox = AppDomain.CreateDomain("Sandbox", evidence, setup); 
var verifier = (Sample)_sandbox.CreateInstanceAndUnwrap(thisAssemblyName, typeof(Sample).FullName); 
verifier.DebugPrint(); 

검증 한 방법으로 일반 클래스입니다 위의 코드는 MarshalByRefObject에서 상속 받아 현재 도메인에서 만든 복사본을 호출하는 대신 자식 appdomain에 DebugPrint 호출을 마샬링해야합니다 (감사합니다 sthotakura). 결과적으로 ConfigurationFile 설정이 작동하기 시작합니다. 그러나 SetConfigurationBytes를 사용하면 아무런 운이 없습니다. 어쨌든 목표는 SetConfigurationBytes를 통해 전달 된 경우 작동하는 bindingRules를 정의하는 것이 었습니다.

답변

2

AppDomain 경계를 가로 지르는 객체에 액세스하려면 클래스는 MarshalByRefObject에서 파생되어야합니다. MSDN 페이지에서

:

MarshalByRefObject에서 상속해야합니다

유형 개체의 구성원이 사용할 수 없기 때문에 유형이 응용 프로그램 도메인 경계를 넘어 사용하고, 객체의 상태가 복사 할 수 있어야합니다 outside 응용 프로그램 도메인이 만들어졌습니다. 당신의 샘플 클래스 MarshalByRefObject에서 파생한다는 뜻

: 나는 샘플 응용 프로그램에서 시도

[Serializable] 
public class Sample : MarshalByRefObject 
{ 
    public void DebugPrint() 
    { 
     Console.WriteLine("====================================="); 
     Console.WriteLine(ConfigurationManager.AppSettings.Count); 
     Console.WriteLine("Reading config: =====|{0}|=====", ConfigurationManager.AppSettings["MyData"]); 
     Console.WriteLine("====================================="); 
    } 
} 

, 대신 SetConfigurationData 전화의 구성을 XML로하고 다음 작품은 내 샘플 코드 참조 용 :

var setup = new AppDomainSetup(); 
setup.ConfigurationFile = "SandBoxConfig.xml"; 
var sandbox = AppDomain.CreateDomain("Sandbox", null, setup); 
var verifier = (Sample)sandbox.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Sample).FullName); 
verifier.DebugPrint(); 

편집

구성 파일 정보MSDN 페이지에서

, AppDomainSetup.SetConfigurationBytes Method

일부 소비자들은 SetConfigurationBytes 방법에 의해 저장된 정보를 사용하지 않습니다. 런타임 은이를 시행하지 않습니다. 새 응용 프로그램 도메인에서 모든 구성 파일 정보가 대체되도록하려면 ConfigurationFile 속성을 사용하여 구성 파일을 지정하십시오. SetConfigurationBytes 메서드는 어셈블리 바인딩에 영향을줍니다.

그래서, 나는 SetConfigurationBytes 통해 제공되는 구성 데이터를 무시 System.Configuration 네임 스페이스 (같은 ConfigurationManager)에서, 유형을 의심한다.

+0

좋은 캐치! SetConfigurationBytes()에 대해 묻는 중입니다. – olegz

+0

@olegz 그래, 새로운 appdomainin에 대한 새로운 구성을 제공하는 것에 반대하여 새로운 AppDomain에 대한 구성 비트를 대체하겠습니까? – sthotakura

+0

@olegz SetConfigurationBytes를 통해 전달되는 내용이 무시당하는 것처럼 보입니다. (원래 질문에서 – sthotakura

0

SetConfigurationBytes가 작동합니다. App을 나타 내기 위해 XDocument를 만들었습니다.다음과 같이 구성하십시오.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
<probing privatePath="TestProbingPath" /> 
</assemblyBinding> 
</runtime> 
</configuration> 

XDocument doc=as above 
MemoryStream stream = new MemoryStream(); 
doc.Save(stream); 
byte[] configBytes = stream.ToArray(); 

stream.GetBuffer는 작동하지 않습니다.