从带有自定义对话框的 Visual Studio 扩展中加载引用的程序集时,BindingPaths 似乎不受尊重
BindingPaths do not seem to be honored when loading referenced Assemblies from within a Visual Studio Extension with custom dialog
我创建了一个使用引用程序集的 Visual Studio 2013 扩展。这些程序集由 vsix 安装到包文件夹的子文件夹中。
我还将这个具有 ProvideBindingPath
属性的子文件夹添加到 .pkgdef
文件中。注册表 (HKCU\Software\Microsoft\VisualStudio.0_config\BindingPaths\{PACKAGEGUID}
) 在安装 vsix 时更新为正确的路径。
所以 MyExtension.pkgdef
看起来像这样:
...
[$RootKey$\InstalledProducts\MyPackage]
@="#110"
"Package"="{f9c9068e-d551-49b1-b3c5-ffaff2ad6398}"
"PID"="3.0.0.5"
"ProductDetails"="#112"
"LogoID"="#400"
[$RootKey$\BindingPaths\{F9C9068E-D551-49B1-B3C5-FFAFF2AD6398}]
"$PackageFolder$\LibsV3"=""
[$RootKey$\BindingPaths\{F9C9068E-D551-49B1-B3C5-FFAFF2AD6398}]
"$PackageFolder$"=""
...
这就是 extension.vsixmanifest
的样子
<PackageManifest>
<Metadata>
<Identity Id="F9C9068E-D551-49B1-B3C5-FFAFF2AD6398" Version="3.0.0.5" Language="en-US" Publisher="kmavize" />
...
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" Path="MyExtension.pkgdef" />
<Asset Type="Microsoft.VisualStudio.Assembly" Path="MyEditor3.dll" AssemblyName="MyEditor3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=5555555555555555" />
<Asset Type="Microsoft.VisualStudio.Assembly" Path="LibsV3\MyRefAssembly.dll" AssemblyName="MyRefAssembly, Version=3.0.0.0, Culture=neutral, PublicKeyToken=5555555555555555" />
...
</Assets>
</PackageManifest>
当我的自定义编辑器加载时出现异常,无法找到引用的程序集(LibsV3 文件夹中的程序集)。
我确实将这些引用的程序集放在 LibsV3 子文件夹中,以便我的 T4 模板(也是我的扩展的一部分)能够区分当前版本 (V3) 程序集和具有相同名称的旧版本程序集用于不同的扩展(我会同时安装)。
也许有另一种方法可以解决我最初使用 T4 模板的问题,所以我不会 运行 在程序集中找不到异常...
正如 Jason 所建议的那样,我刚刚在新的注册表项下添加了第二个路径并且它起作用了。
所以我的 pkgdef
现在看起来像这样:
...
[$RootKey$\InstalledProducts\MyPackage]
@="#110"
"Package"="{f9c9068e-d551-49b1-b3c5-ffaff2ad6398}"
"PID"="3.0.0.5"
"ProductDetails"="#112"
"LogoID"="#400"
[$RootKey$\BindingPaths\{16766769-9969-4A46-A76B-76698F6374F2}]
"$PackageFolder$\LibsV3"=""
[$RootKey$\BindingPaths\{F9C9068E-D551-49B1-B3C5-FFAFF2AD6398}]
"$PackageFolder$"=""
...
我创建了一个使用引用程序集的 Visual Studio 2013 扩展。这些程序集由 vsix 安装到包文件夹的子文件夹中。
我还将这个具有 ProvideBindingPath
属性的子文件夹添加到 .pkgdef
文件中。注册表 (HKCU\Software\Microsoft\VisualStudio.0_config\BindingPaths\{PACKAGEGUID}
) 在安装 vsix 时更新为正确的路径。
所以 MyExtension.pkgdef
看起来像这样:
...
[$RootKey$\InstalledProducts\MyPackage]
@="#110"
"Package"="{f9c9068e-d551-49b1-b3c5-ffaff2ad6398}"
"PID"="3.0.0.5"
"ProductDetails"="#112"
"LogoID"="#400"
[$RootKey$\BindingPaths\{F9C9068E-D551-49B1-B3C5-FFAFF2AD6398}]
"$PackageFolder$\LibsV3"=""
[$RootKey$\BindingPaths\{F9C9068E-D551-49B1-B3C5-FFAFF2AD6398}]
"$PackageFolder$"=""
...
这就是 extension.vsixmanifest
的样子
<PackageManifest>
<Metadata>
<Identity Id="F9C9068E-D551-49B1-B3C5-FFAFF2AD6398" Version="3.0.0.5" Language="en-US" Publisher="kmavize" />
...
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" Path="MyExtension.pkgdef" />
<Asset Type="Microsoft.VisualStudio.Assembly" Path="MyEditor3.dll" AssemblyName="MyEditor3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=5555555555555555" />
<Asset Type="Microsoft.VisualStudio.Assembly" Path="LibsV3\MyRefAssembly.dll" AssemblyName="MyRefAssembly, Version=3.0.0.0, Culture=neutral, PublicKeyToken=5555555555555555" />
...
</Assets>
</PackageManifest>
当我的自定义编辑器加载时出现异常,无法找到引用的程序集(LibsV3 文件夹中的程序集)。
我确实将这些引用的程序集放在 LibsV3 子文件夹中,以便我的 T4 模板(也是我的扩展的一部分)能够区分当前版本 (V3) 程序集和具有相同名称的旧版本程序集用于不同的扩展(我会同时安装)。
也许有另一种方法可以解决我最初使用 T4 模板的问题,所以我不会 运行 在程序集中找不到异常...
正如 Jason 所建议的那样,我刚刚在新的注册表项下添加了第二个路径并且它起作用了。
所以我的 pkgdef
现在看起来像这样:
...
[$RootKey$\InstalledProducts\MyPackage]
@="#110"
"Package"="{f9c9068e-d551-49b1-b3c5-ffaff2ad6398}"
"PID"="3.0.0.5"
"ProductDetails"="#112"
"LogoID"="#400"
[$RootKey$\BindingPaths\{16766769-9969-4A46-A76B-76698F6374F2}]
"$PackageFolder$\LibsV3"=""
[$RootKey$\BindingPaths\{F9C9068E-D551-49B1-B3C5-FFAFF2AD6398}]
"$PackageFolder$"=""
...