VSPackage 中的资源

可以在本机附属 UI DLL、托管附属 DLL 或托管 VSPackage 本身中嵌入本地化资源。

某些资源不能嵌入到 VSPackages 中。 可以嵌入以下托管类型:

  • 字符串

  • 包加载密钥(也是字符串)

  • 工具窗口图标

  • 编译的命令表输出 (CTO) 文件

  • CTO 位图

  • 命令行帮助

  • 关于对话框数据

托管包中的资源由资源 ID 选择。 例外情况是 CTO 文件,该文件必须命名为 CTMENU。 CTO 文件必须以资源表的形式 byte[]显示。 所有其他资源项均按类型标识。

可以使用该 PackageRegistrationAttribute 属性向 Visual Studio 指示托管资源是否可用。

[PackageRegistration(UseManagedResourcesOnly = true)]
public sealed class MyPackage : Package

以这种方式设置 PackageRegistrationAttribute 指示 Visual Studio 在搜索资源时应忽略非托管附属 DLL,例如通过使用 LoadPackageString。 如果 Visual Studio 遇到两个或更多具有相同资源 ID 的资源,则它使用找到的第一个资源。

示例

以下示例是工具窗口图标的托管表示形式。

<data name="1001"
     type="System.Resources.ResXFileRef,System.Windows.Forms">
     <value>
     MyToolWinIcon.bmp;
     System.Drawing.Bitmap,
     System.Drawing,
     Version=1.0.0.0,
     Culture=neutral,
     PublicKeyToken=b03f5f7f11d50a3a
     </value>
</data>

以下示例演示如何嵌入 CTO 字节数组,该数组必须命名为 CTMENU。

<data name="CTMENU"
     type="System.Resources.ResXFileRef,System.Windows.Forms">
     <value>
     MyPackage.cto;
     System.Byte[],
     mscorlib,
     Version=1.0.0.0,
     Culture=neutral,
     PublicKeyToken=b03f5f7f11d50a3a
     </value>
</data>

实现说明

Visual Studio 会尽可能延迟加载 VSPackage。 在 VSPackage 中嵌入 CTO 文件的后果是,Visual Studio 必须在安装程序期间在内存中加载所有这些 VSPackage,即生成合并的命令表时。 可以通过检查元数据而不在 VSPackage 中运行代码,从 VSPackage 中提取资源。 VSPackage 目前未初始化,因此性能损失最小。

当 Visual Studio 在安装后从 VSPackage 请求资源时,该包可能已加载和初始化,因此性能损失最小。