在我的应用程序中,我创建沙箱域,我需要动态定义绑定重定向规则。但是,我不能使用ConfigurationFile方法传递SetConfigurationBytes设置或原始xml数据。
我创建了一个示例来检查配置数据是否应用于子域:
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();其中Verifier是普通类,有一个方法:
public class Sample: MarshalByRefObject
{
public void DebugPrint()
{
Debug.WriteLine("=====================================");
Debug.Print("Reading config: =====|{0}|=====", ConfigurationManager.AppSettings["MyData"]);
Debug.WriteLine("=====================================");
}
}上面代码的第一个问题是必须从继承到封送对子应用程序域的DebugPrint调用,而不是对在当前域中创建的副本进行调用(谢谢sthotakura)。因此,ConfigurationFile设置开始使用work.However,但SetConfigurationBytes仍然不太好。无论如何,我们的目标是定义bindingRules,如果通过SetConfigurationBytes传递它就能工作。
发布于 2013-11-27 05:57:20
要跨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("=====================================");
}
}我尝试过在一个示例应用程序中使用Config,而不是调用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法
配置文件信息的某些使用者不使用SetConfigurationBytes方法存储的信息。运行库不强制执行此操作。若要确保在新的应用程序域中替换所有配置文件信息,请使用ConfigurationFile属性指定配置文件。SetConfigurationBytes方法确实会影响程序集绑定。
因此,我怀疑System.Configuration名称空间中的类型(如ConfigurationManager)忽略了通过SetConfigurationBytes提供的配置数据。
发布于 2014-03-14 15:30:35
SetConfigurationBytes确实能工作。我构造了一个XDocument来表示App.Config,如下所示
<?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将无法工作。
https://stackoverflow.com/questions/20233965
复制相似问题