为并行程序集创作 DLL

创建自己的并行程序集时,请遵循 创建并行程序集指南 ,并根据以下准则创作程序集中使用的任何 DLL:

  • 应设计 DLL,以便多个版本可以同时在同一进程中运行,而不会相互干扰。 例如,许多应用程序托管多个插件,每个插件都需要一个组件的不同版本。 并行程序集的开发人员需要设计和测试,以确保组件的多个版本在同一进程中同时运行时正常工作。

  • 如果计划在早于 Windows XP 的系统上提供组件作为共享组件,则需要继续将这些组件作为单实例共享组件安装在这些系统上。 在这种情况下,需要确保组件向后兼容。

  • 当程序集的多个版本在系统上运行时,评估对象的使用。 确定程序集的不同版本是否需要单独的数据结构,例如内存映射文件、命名管道、已注册的 Windows 消息和类、共享内存、信号灯、互斥体和硬件驱动程序。 跨程序集版本使用的任何数据结构都必须向后兼容。 确定哪些数据结构可以跨版本使用,哪些数据结构必须专用于某个版本。 确定共享数据结构是否需要单独的同步对象,例如信号灯和互斥体。

  • 某些对象(如窗口类和 Atoms)为每个进程唯一命名。 应使用清单对每个程序集(如窗口类)的对象进行版本控制。 对于 Atoms 等对象,除非计划跨版本共享,否则请使用特定于版本的标识符。 如果使用特定于版本的标识符,请使用由四部分构成的版本编号。

  • 在任何 DLL 中不包含自注册代码。 并行程序集中的 DLL 不能自注册。

  • 使用 #define 语句定义 DLL 中的所有特定于版本的名称。 这允许从一个位置更改所有注册表项。 发布新版本的程序集时,只需更改此 #define 语句。 例如:

    #define MyRegistryKey "MyAssembly1.0.0.0"

  • 将任何非持久性数据存储在 Temp 目录中。

  • 不要将用户数据放入全局位置。 将应用程序数据与用户数据分开。

  • 为所有共享文件分配一个取决于应用程序名称的文件版本。

  • 将跨进程使用的所有消息和数据结构分配一个版本,以防止意外的跨进程共享。

  • DLL 不应依赖于跨可能不存在的版本进行共享,例如未在程序集的不同版本之间共享的共享内存部分。

  • 如果添加的新功能不遵循原始 DLL 的二进制接口兼容性协定,则必须分配新的 CLSID、ProgId 和文件名。 然后,需要并行程序集的未来版本才能使用此 CLSID、ProgId 和文件名。 这可以防止在并行版本上注册非并行 DLL 版本时发生冲突。

  • 如果重复使用相同的 CLSID 或 ProgId,请进行测试以确保程序集向后兼容。

  • 在程序集代码中初始化和设置程序集的默认设置。 不要在注册表中保存默认设置。

  • 将版本分配给所有数据结构。

  • DLL 应存储并行程序集的状态,如 为并行程序集创作状态存储中所述。