首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使AppDomainSetup.SetConfigurationBytes()工作?

如何使AppDomainSetup.SetConfigurationBytes()工作?
EN

Stack Overflow用户
提问于 2013-11-27 04:33:07
回答 2查看 730关注 0票数 0

在我的应用程序中,我创建沙箱域,我需要动态定义绑定重定向规则。但是,我不能使用ConfigurationFile方法传递SetConfigurationBytes设置或原始xml数据。

我创建了一个示例来检查配置数据是否应用于子域:

代码语言:javascript
复制
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是普通类,有一个方法:

代码语言:javascript
复制
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传递它就能工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-27 05:57:20

要跨AppDomain边界访问对象,类必须从MarshalByRefObject派生。

来自MSDN页面:

当跨应用程序域边界使用类型时,类型必须从MarshalByRefObject继承,并且不能复制对象的状态,因为对象的成员不能在创建它们的应用程序域之外使用。

这意味着,示例类应该从MarshalByRefObject派生

代码语言:javascript
复制
[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,下面是我的示例代码供您参考:

代码语言:javascript
复制
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提供的配置数据。

票数 2
EN

Stack Overflow用户

发布于 2014-03-14 15:30:35

SetConfigurationBytes确实能工作。我构造了一个XDocument来表示App.Config,如下所示

代码语言:javascript
复制
<?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将无法工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20233965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档