问题:
我必须(在 VB.NET 中)通过 COM-Wrapper 使用应用程序(Aperture)的 OLE 自动化。
目前,我关闭选项严格,并这样做(使用后期绑定):
Dim m_Aperture As Object = CreateObject("Aperture.Application")
Dim m_Project As Object = m_Aperture.Project
你看到问题了,一切都是对象,没有智能感知等。
非常糟糕。
由于我想让智能感知和编译时检查工作,我尝试自动创建一个 COM 包装器,如下所示:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\TlbImp.exe" OEAPP.TLB /out:Aperture.dll
到目前为止工作出色,它创建了包装器,我可以在它上面使用智能感知(虽然返回类型都是动态类型)。
所以我试图重写上面的示例代码(现在在 C# 中):
第一次尝试是:
Aperture.OEAppClass app = new Aperture.OEAppClass();
但是我得到了这个编译器错误:
Interop-Type Aperture.OEAppClass cannot be embedded. Use interface instead.
所以我尝试通过界面来做到这一点:
Aperture.OEApp Ap = (Aperture.OEApp)Microsoft.VisualBasic.Interaction.CreateObject("Aperture.Application");
这让我在运行时出现异常
InvalidCastException
"System.__ComObject" cannot be converted into interface type "Aperture.OEApp".
0x80010105 (RPC_E_SERVERFAULT)).
所以我试图找出接口类型使用
dynamic Ap2 = Microsoft.VisualBasic.Interaction.CreateObject("Aperture.Application");
和对象检查器。
我发现接口实际上是 Aperture._IOEApp 类型的。所以我用
Aperture._IOEApp Ap = (Aperture._IOEApp)Microsoft.VisualBasic.Interaction.CreateObject("Aperture.Application");
但现在我明白了
InvalidCastException
"System.__ComObject" cannot be converted into interface type "Aperture._IOEApp".
0x80010105 (RPC_E_SERVERFAULT)).
现在我不知道问题可能是什么了。
谁能告诉我我做错了什么?
或者这应该如何工作?