C#中的静态上下文总是单一的吗?
我有一个库,里面有一个静态字段。我想创建一个应用程序并引用这个库,这样我就有了这个静态字段的两个实例。Net运行时不允许两次引用同一个库,但我想知道是否有可能克服这个限制C#中的静态上下文总是单一的吗?,c#,.net,C#,.net,我有一个库,里面有一个静态字段。我想创建一个应用程序并引用这个库,这样我就有了这个静态字段的两个实例。Net运行时不允许两次引用同一个库,但我想知道是否有可能克服这个限制 我不允许更改库,但我可以复制/重命名它。这并不像你想象的那么疯狂。事实上,您可以通过使用来实现这一点 每个都有自己的静态变量存储位置。因此,您可以在流程中创建第二个AppDomain,并使用继承自中的MarshalByRefObject的对象在它们之间进行通信。而在AppDomains上工作时,您也可以使用泛型创建此效果,因为
我不允许更改库,但我可以复制/重命名它。这并不像你想象的那么疯狂。事实上,您可以通过使用来实现这一点 每个都有自己的静态变量存储位置。因此,您可以在流程中创建第二个AppDomain,并使用继承自中的
MarshalByRefObject
的对象在它们之间进行通信。而在AppDomains上工作时,您也可以使用泛型创建此效果,因为具有不同泛型类型参数的类被视为不同的类,因此它有自己的静态场
public class SomeClass<T>
{
public static string SomeField;
}
公共类SomeClass
{
公共静态字符串字段;
}
然后:
SomeClass.SomeField=“A”;
SomeClass.SomeField=“B”;
Console.WriteLine(SomeClass.SomeField);//A.
Console.WriteLine(SomeClass.SomeField);//B
例如,
SomeClass
将在库中设置,而SomeClass
将是您的副本。当然,这只有在您可以更改库或者库已经使用泛型的情况下才有效。这两个建议都应该有效,但它们在体系结构方面都非常好
我不知道上下文,但在您的情况下,是否可以创建一个具有新属性的聚合类,该属性不是静态的,只有两个实例。
这对我来说似乎是个更好的方法
每次我有智能代码时,我的大脑就会发出警报。智能代码对于开发人员来说总是太聪明了。我喜欢你的答案,请你提供一些甜蜜的LoC:)@Jeremy我的答案中有一个完整的使用代理的跨应用程序域通信示例。这可能不疯狂,但它确实发出了一点“糟糕的体系结构警报”对我来说,这是我见过的最美丽、最可怕的泛型滥用之一。@BradleyUffner等到你在C++中看到CRTP单例,是的,但这些是不同的字段,不是同一静态字段的两个实例。@immibis:奇怪的循环泛型模式在C#中也非常方便。我完全意识到这一点的后果。我在问题的开头解释了这一点,但主持人由于话题无关而删除了这一部分。我有一个我无法更改的第三方库,它有两次我需要的功能,但它是静态的,所以我只能使用一次。我问过图书馆的创建者,他的回答是尝试使用黑客,因为重新设计太难了。拥有两个域的方法非常有效,而且看起来非常简单和合适(除了你必须管理生命周期),所以我对它很在行。但是你是对的——重要的是要指出,除非你真的必须这样做,否则你不应该使用这种方法
SomeClass<int>.SomeField = "A";
SomeClass<string>.SomeField = "B";
Console.WriteLine(SomeClass<int>.SomeField); // A
Console.WriteLine(SomeClass<string>.SomeField); // B