从类库创建 vsix 包

本文关键字:vsix 创建 类库 | 更新日期: 2023-09-27 18:33:44

我有一个创建为类库的项目。此库包含许多可在 Windows 窗体应用程序中使用的控件。现在,我想创建一个安装包 (*.vsix(,它将这些控件嵌入到 Visual Studio 工具箱窗口中。我还有一个充满 Web 控件的项目,但此刻我想专注于任务的 Win 控件部分。

当我在本身包含此项目的解决方案中时,控件在工具箱窗口中可见。

我创建了一个 vsix 项目,并将组件项目的 dll 作为Microsoft.VisualStudio.Assembly资产引用。生成过程将创建我需要的 vsix 文件。当我在具有全新VS安装的系统上运行它时,它会毫无问题地完成安装过程,但是组件不会显示在工具箱中。

当我尝试将资产注册为Microsoft.VisualStudio.ToolboxControl时,出现错误'The target "PkgdefProjectOutputGroup" does not exist in the project.'.我在谷歌上找到的信息对我没有帮助。

我不确定这里的问题是什么。我可能错过了几步,但我不知道到底是什么。

我还发现了关于WiX工具集的文章来创建软件包,但我不确定这是否是我正在寻找的东西。

编辑:我发现了给我'The target "PkgdefProjectOutputGroup" does not exist in the project.'消息的原因,是我没有在资产窗口中为"嵌入此文件夹"文本框提供值。构建传递,但组件在 VS 中仍然不可见。

编辑2:经过几天的修补,我仍然无法为控件创建包。我使用这篇文章作为我的主要参考和其他一些文章,似乎没有什么能解决问题。

我尝试使用作为示例提供的TCI安装程序应用程序。我首先在样本控件上使用它,它完美无缺,但在我自己的库上使用它没有产生任何结果。我已经在我自己的库中添加了一个示例控件,只是为了检查我是否可能发疯,但该控件仍然没有显示在工具箱中。我添加的控件再简单不过了:

[ToolboxBitmap(typeof(IdiotControl))]
[ToolboxItem(true)]
public partial class IdiotControl : UserControl
{
    public IdiotControl()
    {
        InitializeComponent();
    }
}

同样,当我想手动从 dll 添加控件时(右键单击工具箱选项卡 ->选择项目 ->浏览 dll(,控件会显示,我可以将它们拖放到表单上,但这对我来说是不可接受的。

我还在 C:'Users'John'AppData'Local'Microsoft'VisualStudio'11.0'Extensions'doeehng3.0ko 中找到了安装位置(最后一部分可能是随机生成的(,所有文件都在它们应该在的位置,工具箱中仍然没有控件(从这个位置手动添加它们也可以(。

从类库创建 vsix 包

花了 2 天的时间,我终于能够解决以下错误,该错误是在将 DLL 应用程序添加到 VSIX 项目的 VSIX 项目以进行可视化C++时出现的:

目标"PkgdefProjectOutputGroup"在项目中不存在。

只需打开项目文件.csproj或 DLL 应用程序的.vcxproj,您将将其添加为 VSIX 项目的引用,最后编辑以下行:

Import Project="$(MSBuildExtensionsPath(''Microsoft''VisualStudio''v15.0''VSSDK''Microsoft.VsSDK.Cpp.targets"Import Project="$(VCTargetsPath(''Microsoft.Cpp.targets"Import Project="$(MSBuildExtensionsPath(''Microsoft''VisualStudio''v15.0''VSSDK''Microsoft.VsSDK.Cpp.Overrides.targets

然后生成 VSIX 项目,应解决此错误。

在 VS2022、VSIX 中遇到此问题 - 解决方案是将此行添加到报告缺少目标的项目中:

<Import Project="$(MSBuildExtensionsPath)'$(MSBuildToolsVersion)'Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)'$(MSBuildToolsVersion)'Microsoft.Common.props')" />

(目标会自动添加到 VSIX 项目 - 但是当您导入其他项目并将其标记为 VSIX 中的资产时,这些项目没有上述目标 - 因此出现错误(