目前,我正在使用MEF开发Visual Studio 2010的扩展,我需要初始化我的全局状态.我正在尝试在Package.Initialize方法中执行此操作
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0.0.0", IconResourceID = 400)]
[Guid("1AF4B41B-F2DF-4F49-965A-816A103ADFEF")]
public sealed class MyPackage : Package
{
protected override void Initialize()
{
ContainerConfigurator.Configure();
ContainerConfigurator.IsInitialized = true;
base.Initialize();
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个使用此状态的MEF分类器提供程序
[Export(typeof(IClassifierProvider))]
[Name("This is my provider")]
[ContentType("DebugOutput")]
[ContentType("Output")]
public class MyClassifierProvider : IClassifierProvider
{
[Import]
private IClassificationTypeRegistryService _classificationRegistry = null; // MEF
public IClassifier GetClassifier(ITextBuffer textBuffer)
{
// This always false
if (!ContainerConfigurator.IsInitialized)
throw new InvalidOperationException();
return textBuffer.Properties.GetOrCreateSingletonProperty(() => new TypedClassifier(ServiceLocator.Current, _classificationRegistry));
}
}
Run Code Online (Sandbox Code Playgroud)
包和MEF分类器都在同一个程序集中.当我开始调试并放置一个断点时,我看到这个组件被加载了.但MyClassifierProvider已在MyPackage.Initialize调用之前初始化.因此,在启动任何MEF组件之前,我无法初始化我的全局状态.任何人都可以解释为什么以及如何避免这种行为?
谢谢
当发现以下代码在运行时抛出异常时,我感到很惊讶:
class A
{
public string Name { get; set; }
public A()
{
Name = "Class A";
}
}
class B
{
public string Name { get; set; }
public B()
{
Name = "Class B";
}
public static explicit operator A(B source)
{
return new A() {Name = source.Name};
}
}
class Program
{
static void Main(string[] args)
{
// This executes with no error
var bInstance = new B();
Console.WriteLine(bInstance.GetType()); // <assemblyname>.B
var aInstance = (A) bInstance; …Run Code Online (Sandbox Code Playgroud)