更新Dictionary <string,string =“”>值没有任何反应

时间:2017-06-16 16:37:56

标签: c# dictionary mstest appdomain microsoft-fakes

我正在使用Microsoft Fakes和一些垫片测试遗留代码。 为了在共享资源的访问中测试并发性,我必须创建一些AppDomains,我将其传递给它们的上下文。 这不能仅用线程来完成,因为垫片不是线程安全的。 我还希望在将该上下文返回到主AppDomain时,我可以将该数据用于测试期望。

我的夹具的一个属性是一个字典,我在我的垫片内更新遗留代码。 我遇到的问题是我无法更新字典的值。

在这个方法中,我修改了一个写入注册表的静态类:


    public static void ShimRegistry(PlafondManagerTestFixtureUser fixture)
        {
            Common.Util.Fakes.ShimRegistryHelper.SetLocalMachineRegistrySettingStringStringString = (parent, key, value) => {
                if (fixture.Registries != null)
                {
                    var quant = Decrypt(value);
                    if (fixture.Registries.ContainsKey(key))
                        fixture.Registries[key] = quant;
                    else
                        fixture.Registries.Add(key, quant);
                }

                return null;
            };
            Common.Util.Fakes.ShimRegistryHelper.GetLocalMachineRegistrySettingStringStringString = (parent, key, value) => {
                string val;
                fixture.Registries.TryGetValue(key, out val);
                return Encrypt(val);
            };
        }

当我调试这个时,我可以看到

fixture.Registries[key] = quant;
之前我有“0”作为字典条目的值和quant中的“2”。 运行该行后,字典条目仍然显示为“0”。

我坚持这个,我在堆栈溢出时找不到类似的问题(或者我找不到合适的词来形容它)。

此设置的其他部分工作正常。我可以在主线程上收到更新的字符串,所以我怀疑这与我在AppDomains之间共享实例有什么关系。

有人能帮我找错吗?

更新 正如Jon Skeet建议的那样,我在mstest,appdomain,shims的上下文之外测试了这个,甚至在错误的代码之前。 在每种情况下它都按预期工作,因此它可能与在夹具中的AppDomains之间共享字典有关。

这是我以前测试的:

Dictionary<string, string> test = new Dictionary<string, string>
{
    { "Key", "Value" }
};
test["Key"] = "Value2";

我有这种感觉,我错过了一些愚蠢的小事,但似乎无法找到它是什么。

更新2: 管理以减少将字典传递到另一个AppDomain的问题。

Here's我放在Github上的示例控制台项目;

更新3: 既然我有更具体的搜索内容,我发现这个答案对我有帮助:Adam Ralph's answer to 'Sharing data between AppDomains'

我打赌要串行化为字符串,因为我已经有办法轻松完成了,但仍然想了解为什么会发生这种情况。

0 个答案:

没有答案