在我们的代码库中,我们使用了大量来自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。
RegisterInstance
方法注册COM对象时才支持。