从C#/ Silverlight中的COM对象访问函数

时间:2012-12-19 10:50:15

标签: c# silverlight com pinvoke

尝试在我的C#app中使用一些COM对象。

第一个变种:

using AXVLC;

Type t = Type.
           GetTypeFromCLSID(
           Guid.Parse("E23FE9C6-778E-49D4-B537-38FCDE4887D8")
           );

AXVLC.VLCPluginClass vid = Activator.CreateInstance(t) as VLCPluginClass;

但是得到这样的错误: 无法嵌入 Interop类型'AXVLC.VLCPluginClass'。请改用适用的界面。 ComObjectCalls

我已经理解COM对象不公开公共构造函数然后我将不得不找到一些使用该对象的方法。很多时候COM对象使用工厂模型来创建对象的实例(例如,IClass instance = COMClass.CreateInstance();)

或尝试使用 Activator.CreateInstance()

我还有另一个关于COM对象的问题:   - 我使用动态类型: 动态shell = AutomationFactory.CreateObject(“WMPlayer.OCX.7”);

它创造 - 好吧。但是如何知道,我可以在其中使用哪些方法。我该如何施展它?

主要问题是:我想用Silverlight应用程序访问COM-object。 因此,有一种方法可以使用dynamic / expondo对象或使用P / Invoke调用Silverlight中的一些本机库,如:

[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "MessageBox")]
public static extern IntPtr MineMessageBox(int hWnd, string text,
string caption, uint type);

...
MineMessageBox(0, "Hello World", "Platform Invoke Sample", 0);

在Silverlight中访问COM对象功能的最佳方法是什么,也可以在运行时获取有关此COM对象的所有信息(获取方法,我可以调用等)

谢谢!

2 个答案:

答案 0 :(得分:1)

所有COM对象都符合接口,这是您的方法的来源。

对于VLC ActiveX控件,您可能不使用AXVLC.VLCPluginClass,而是使用AXVLC.VLCPlugin。这类似于Office使用Application代替ApplicationClass的互操作。

在使用dynamic时的第二个实例中,一种让您的IntelliSense正常工作的简单方法是简单地将CreateObject的返回值转换为接口。但是,您需要记住在构建之前删除它,否则演员表将在运行时失败。

另一种选择(更好的方法)就是简单地处理该COM对象的文档。

答案 1 :(得分:1)

使用AutomationFactory类和dynamic关键字(最低.net 4.0 / sl 4.0)。