我正在集成一个对象是 COM 对象的会计系统。
当如下一对一绑定时,它工作得很好。
IKernel kernel = new StandardKernel();
kernel.Bind<IAcoSDKX>().ToMethod(_ => { return new AcoSDKX(); }).InSingletonScope();
我遇到的情况是IAcoSDKX
和AcoSDKX
都是接口,AcoSDKClass
消费者无法访问。
所以我正在寻找一种将两个接口绑定在一起的方法,因为它们的拼写不同。Ont 以“I”开头,而其他则没有。所以我想提出一个传统的绑定,即使我一直使用未绑定的接口,Ninject 也知道在通过构造函数注入激活对象时将其绑定到什么。
这是我到目前为止没有成功的尝试。
kernel.Bind(services => services
.FromAssembliesMatching("AcoSDK.dll")
.SelectAllTypes()
.Where(t => t.Name.StartsWith("I") && t.IsInterface)
.BindDefaultInterfaces());
所以我想知道,如何使用 Ninject 配置一个可以满足实际需要的约定绑定?
基本上,约定是将所有以“I”开头的接口与具有相同名称但没有“I”前缀的接口绑定。
编辑
经过进一步搜索,我发现AcoSDK.dll的类型嵌入到我自己的程序集中。只有提前加载的类型是可绑定的。
此外,虽然我可以新建一个 COM 对象接口,但Activator.CreateInstance不会以它是一个接口为借口对其进行初始化。请参阅对象声明如下:
namespace AcoSDK {
[ComImport]
[Guid("00000114-0000-000F-1000-000AC0BA1001"]
[TypeLibType(4160)]
public interface IAcoSDKX { }
[ComImport]
[Guid("00000114-0000-000F-1000-000AC0BA1001")]
[CoClass(typeof(AcoSDKClass))]
public interface AcoSDKX : IAcoSDKX { }
[ComImport]
[Guid("00000115-0000-000F-1000-000AC0BA1001")]
[TypeLibType(2)]
[ClassInterface(0)]
public class AcoSDKXClass : IAcoSDKX, AcoSDKX { }
}
public class Program() {
// This initializes the type.
IAcoSDKX sdk = new AcoSDKX();
// This also does.
IKernel kernel = new StandardKernel();
kernel.Bind<IAcoSDKX>().ToMethod(_ => new AcoSDKX());
// This won't activate because type is an interface.
IAcoSDKX sdk = Activator.CreateInstance(typeof(AcoSDKX));
// This says : Interop type AcoSDKXClass cannot be embedded. Use the applicable interface instead.
IAcoSDKX sdk = Activator.CreateInstance(typeof(AcoSDKXClass));
// Same message occurs when newing.
IAcoSDKX sdk = new AcoSDKClass();
}
鉴于这些新信息,是否有人对 COM 对象有类似的体验?我试图以AcoSDKClass
任何方式更新或访问它,但我似乎没有得到它的钩子。