1

在我的计算机上,多个程序正在运行,需要访问 COM 对象提供的 iTunesApp 接口。经过一些测试,我发现某些交互(特别是事件监听)只能在对象的“原始”实例中进行。这意味着如果 iTunes 已经在运行并且我运行,iTunesApp app = new iTunesApp()我将创建一个 iTunesApp 实例,它可以访问库和播放/暂停等,但不会app.OnPlayerPlayEvent在触发之类的事件时被调用。如果我想监听事件,我必须在iTunesApp app = new iTunesApp()iTunes 尚未运行的情况下运行。

所以我对此的解决方案是我只在启动时运行一个程序,启动 iTunes 并iTunesApp与任何其他需要它的程序共享该对象。不幸的是,该类不可序列化,因此我无法轻松地将其转换为 byte[] 数组。

我的问题是:是否有可能将对象转换为字节数组并通过MemoryMappedFileSocket类似方式共享?我已经尝试BinaryFormatter.Serialize()过以及ProtoBuf包装,但都没有奏效。或者是否有一种方法或某种东西可以让我iTunesApp从正在运行的 iTunes 实例中获取对象?

4

1 回答 1

1

COM 具有封送对象的标准方法。调用CoMarshalInterface将对象编组为流(有关 C# 声明,请参阅pinvoke.net 上的 CoMarshalInterface)。然后,您可以读取写入 IStream 的字节,将这些字节提供给任何进程,使用CoUnmarshalInterface解组。确保为您的用例使用正确的标志。

于 2016-10-11T20:31:42.693 回答