【问题标题】:Writing COM servers for the windows API in C#, where to begin?用 C# 为 windows API 编写 COM 服务器,从哪里开始?
【发布时间】:2012-03-17 03:11:30
【问题描述】:

我正在尝试编写一些插件来使用Terminal Services Session Broker Plugin Interface。我精通 C#,但自 90 年代后期以来我没有做过任何 C++。对于我正在编写的插件,我计划与数据库进行通信,并且我更喜欢使用System.Data.SqlClient 与它交谈,因为我知道它的来龙去脉相当好。我有Windows SDK,它为我提供了接口的.idl 文件(tssbx.idl)。 SDK还提供了一个C头文件(tssbx.h)和一个C源文件(tssbx_i.c)。

我以前从未编写过 COM 服务器,并且在寻找学习如何读取 IDL 文件并将其转换为 C# 的资源时遇到了很多麻烦。我发现的所有内容都说“Use TlbImport”,但这需要像 library 这样的块在 IDL 中,而 tssbx.idl 没有(及其依赖项)没有实现。

什么是我最好的选择:

  1. 查找与MIDL 等效的 C# 工具,用于将 .idl 文件解析为 .cs 文件。
  2. 学习 IDL(我一直找不到好的指南来学习它)并用 C# 手工编写整个内容。
  3. 使用提供的 C 文件编写一个帮助程序 dll,并将该调用用于我的 .NET 部件的 C# dll。
  4. 重新学习 C++,使用提供的 .h 和 .c 文件,并使用 CLR 进行我的 .NET 调用。
  5. 其他一些我没有想到的选项。

【问题讨论】:

    标签: c# c++ .net winapi com


    【解决方案1】:

    您想要做的事情的方法是将 IDL 定义转换为 C# 接口,然后将这些接口实现为 C# 类。将适当的属性(主要是 ComVisibleClassInterfaceProgId)应用到要公开给 COM 的类,并使用 regasm 工具将程序集注册为 COM 服务器。

    将IDL翻译成C#其实并不复杂;在大多数情况下,它直接从 IDL 关键字映射到 C# 关键字和/或MarshalAs 属性。我有一系列关于如何在没有tlbimp 的情况下进行 COM 互操作的博客文章,其中包括how to read IDL 上的一篇文章。我不知道有什么工具可以很好地完成这项工作,但如果它是 Windows SDK 的一部分,您应该始终先检查 pinvoke.net,以防其他人为您完成。

    就您的其他选项而言,3 和 4 都差不多。除非通过 COM Interop 或混合模式 C++ 库完成,否则不能直接从非托管代码调用托管代码。在第一种情况下,您仍然必须解决让 C# 程序集注册到 COM 以供 C dll 调用的所有问题,因此您不妨跳过中间人。其次,您基本上是手动执行运行时的互操作代码为您执行的相同操作,并且使用您不太熟悉的语言进行引导,这对我来说似乎是一种净损失。

    但请注意,将 .NET 程序集加载到非托管上下文中并非总是可行的;例如,Windows 2008 明确不支持托管 shell 扩展。我不知道 TSSBX 接口是否允许您将托管程序集加载为 COM 对象,因此您必须注意这种可能性。如果你不能,那么你的任何选择都不会奏效,你将不得不完全避免使用 .NET Framework,而使用其他一些数据库访问技术并用非托管 C++ 编写整个项目。

    【讨论】:

    • 当我说“用 IDL 编写”时,我的意思是“用 C# 编写”时有一个错字,我在你写答案时修正了这个错字。我遇到的问题是知道什么映射到什么,看起来你的博客文章会有很大帮助。
    • 酷,我把我的那部分答案去掉了,所以它看起来不会那么不合适:)
    【解决方案2】:

    我将其发布为答案,因为评论太长了

    根据我收集到的信息,在 .NET 中编写此类插件可能会在以后引发问题 - 尤其是。在必须加载多个基于 .NET 的插件并且两个(或更多)插件使用不同的 .NET 版本的情况下(此类问题已在 shell 扩展的上下文中明确提到 - 我只是从这种情况是我怀疑的基础......)。

    至于您的选择,IDL 本身无法实现任何东西 - 它是一种接口描述语言

    我建议使用类似于选项#3 的一些修改:

    将 .NET 部分实现为 Windows 服务,并通过 IPC 在 C 和 .NET 之间进行通信 - 我建议使用速度极快且受 .NET4 良好支持的共享内存。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多