0

试图在我的 C# 应用程序中使用一些 COM 对象。

第一种变体:

using AXVLC;

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

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

但出现此类错误: 无法嵌入互操作类型“AXVLC.VLCPluginClass”。请改用适用的接口。ComObjectCalls

我知道 COM 对象不公开公共构造函数,那么我将不得不找到使用该对象的其他方法。很多时候 COM 对象使用工厂模型来创建对象的实例(例如 IClass instance = COMClass.CreateInstance(); )

或尝试使用Activator.CreateInstance()

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

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

主要问题是:我想用 Silverlight 应用程序访问 COM 对象。所以有一种方法可以使用动态/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 对象的所有信息(获取方法,我可以调用等)

谢谢!

4

2 回答 2

1

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

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

在您使用的第二个实例中dynamic,让您的 IntelliSense 工作的一个 hacky 方法是简单地将 return fromCreateObject转换为接口。但是,您需要记住在构建之前将其删除,否则强制转换将在运行时失败。

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

于 2012-12-19T10:56:26.087 回答
1

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

于 2013-01-07T23:05:44.543 回答