gpt4 book ai didi

c# - 在 C# 中为 Windows API 编写 COM 服务器,从哪里开始?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:11 24 4
gpt4 key购买 nike

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

我以前从未编写过 COM 服务器,而且我在寻找有关学习如何读取 IDL 文件并将其转换为 C# 的资源时遇到了很多麻烦。我找到的所有内容都说“Use TlbImport”,但这需要像 block 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. 一些我没有想到的其他选择。

最佳答案

完成您想要做的事情的方法是将 IDL 定义转换为 C# 接口(interface),然后将这些接口(interface)实现为 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 接口(interface)是否允许您将托管程序集作为 COM 对象加载,因此您必须意识到这种可能性。如果不能,那么您的所有选项都不会奏效,您将不得不完全避免使用 .NET Framework 并使用其他一些数据库访问技术并使用非托管 C++ 编写整个项目。

关于c# - 在 C# 中为 Windows API 编写 COM 服务器,从哪里开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9468526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com