【发布时间】:2020-07-30 23:44:11
【问题描述】:
我正在尝试通过 C# 访问 COM 对象(CST Studio Suite)。我之前已经通过以下 MATLAB 脚本成功访问并控制了这个对象:
CST = actxserver('CSTStudio.Application'); % Opens CST
CST.FileNew(); % Creates a new file
MWS = CST.Active3D; % Set focus to the new file
MWS.invoke("AddToHistory","Test",""); % Append to history list
这是我试图用来控制 COM 对象的 C# 代码
cst_design_environmentLib.IApplication CST = new cst_design_environmentLib.Application(); // Opens CST
CST.FileNew(); // Creates a new file
dynamic MWS = CST.Active3D(); // Set focus to the new file
MWS.AddToHistory("Test", ""); // Doesn't work, produces an error
一切正常,直到我尝试运行方法 AddToHistory,该方法失败并给出以下错误:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.__ComObject' does not contain a definition for 'AddToHistory'
我知道 AddToHistory 方法存在是因为 1) 我通过 MATLAB 访问了它,并且 2) 它位于 documentation 中。那么为什么它不能通过 C# 运行呢?由于MWS 对象是动态类型的,我知道在编译时找不到该方法,但在运行时仍应找到它,对吧?我已经调试并检查了对象的类型,CST 和MWS 都是System.__ComObject。当我检查这些对象的动态视图时,它显示“无法发现有关此对象的更多信息”,因此它似乎没有找到任何方法。
另外CST的类型是类型库cst_design_environmentLib的一部分所以FileNew()等方法是intellisense预测的,但是我不相信MWS的类型是类型库的一部分类型库。
对此的任何帮助将不胜感激。
【问题讨论】:
-
我注意到您正在使用互操作包装器直到
CST.Active3D()然后您下拉到dynamic这向我建议AddToHistory不可用,因为您使用的是较旧的/错误的 COM 引用。第一个示例是如何创建一个独立于版本的CSTStudio.Application。也许通过Activator.CreateInstance尝试similar 的事情