使用Lifestyle时,注册的COM接口无法解析.辛格尔顿



在我们的代码库中,我们使用了大量来自C#的COM对象,很少有地方使用Interop生成的*class直接创建,而是使用ProgID来创建这些COM对象。

以前基于NInject的代码在这种情况下工作得很好,但现在决定继续使用SimpleInjector。

这可以通过以下示例源代码轻松复制:[添加到C:\Windows\System32\scrrun.dll-"Microsoft Scripting Runtime"中的COM用法示例参考]

public class TextFileCreator
{
private FileSystemObject _fso;
public TextFileCreator(FileSystemObject fso)
{
_fso = fso;
}
public void Do()
{
string filename = _fso.GetTempName();
var tf = _fso.CreateTextFile(filename);
tf.WriteLine("Hello World");
tf.Close();
}
}
public class Program
{
static void Main(string[] args)
{
Container container = new Container();
container.Register<TextFileCreator>();
container.Register(typeof(FileSystemObject), () => {
Type type = Type.GetTypeFromProgID("Scripting.FileSystemObject");
FileSystemObject fso = (FileSystemObject)Activator.CreateInstance(type);
return fso;
}, Lifestyle.Singleton);
TextFileCreator textFileCreator = container.GetInstance<TextFileCreator>();
textFileCreator.Do();
}
static void MainOriginal(string[] args)
{
Type type = Type.GetTypeFromProgID("Scripting.FileSystemObject");
FileSystemObject fso = (FileSystemObject)Activator.CreateInstance(type);
TextFileCreator textFileCreator = new TextFileCreator(fso);
textFileCreator.Do();
}
}

SimpleInjector与Lifestyle.Singleton:的注册

container.Register(typeof(FileSystemObject), () => {
Type type = Type.GetTypeFromProgID("Scripting.FileSystemObject");
FileSystemObject fso = (FileSystemObject)Activator.CreateInstance(type);
return fso;
}, Lifestyle.Singleton);

正在生成以下异常

SimpleInjector。ActivationException:'配置无效。为类型TextFileCreator创建实例失败。的表达式键入"系统"__ComObject"不能用于的构造函数参数键入"Scripting"。FileSystemObject"验证"被触发,原因是容器选项。EnableAutoVerification已启用。为了防止在第一次解析时验证容器,设置容器选项。EnableAutoVerification为false。'

但如果Lifestyle。未使用Singleton。

Simple Injector v5增加了对解析COM对象的支持,但仅在使用RegisterInstance方法注册COM对象时才支持。

最新更新