2013-11-27 44 views
0

在我的應用程序中,我創建了沙箱域,我需要動態定義綁定重定向規則。但是我無法使用SetConfigurationBytes方法傳遞ConfigurationFile設置和原始xml數據。如何獲取AppDomainSetup.SetConfigurationBytes()的工作?

我創建了一個樣品,以檢查是否配置數據被施加到子域:

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(); 

其中驗證爲被一個方法純類:

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

更新 第一個問題與上面的代碼是它必須從MarshalByRefObject繼承,以將調用打印調用編組到子appdomain,而不是在當前域中創建的副本上進行調用(感謝sthotakura)。 因此ConfigurationFile設置開始工作。但是仍然沒有運用SetConfigurationBytes。無論如何,目標是定義bindingRules,如果通過SetConfigurationBytes傳遞的話,它會起作用。

回答

2

要通過AppDomain邊界訪問對象,該類必須從MarshalByRefObject派生。

MSDN頁:

類型必須自MarshalByRefObject繼承當類型用於 跨應用程序域的邊界,並且該對象的狀態必須 不能複製,因爲該對象的成員是不可用的 以外的應用程序域。

這意味着,你的樣品類應該從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("====================================="); 
    } 
} 

我曾經在一個示例應用程序嘗試,但有一個XML配置,而不是調用SetConfigurationData和它的作品,下面是我的示例代碼供大家參考:

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方法不影響程序集綁定。

所以我懷疑,類型System.Configuration名字空間(比如ConfigurationManager)忽略通過SetConfigurationBytes提供的配置數據。

+0

良好的漁獲!我只是詢問SetConfigurationBytes()。 – olegz

+0

@olegz好了,要更換新的AppDomain的配置位,如反對新appdomaiin提供了一個新的配置? – sthotakura

+0

@olegz看起來像任何通過SetConfigurationBytes傳遞越來越在你原來的問題忽略:( – sthotakura

0

SetConfigurationBytes不起作用。我構建了一個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將不起作用。