基于另一个构建Visual Studio包

时间:2010-09-22 03:13:23

标签: visual-studio ironpython vsx

我想基于IronStudio添加自己的项目类型。所以,

  • 我下载了源代码并编译了the latest version of IronPython,然后
  • 我创建了一个新的Visual Studio包。
  • 我添加了Templates\Projects\MyProject个文件夹,并添加了一个文件,并将其属性“包含在VSIX中”设置为true。

然后修改了要从IronStudio的PythonProjectPackage派生的主Package类,并设置ProvideProjectFactory属性:

[ProvideProjectFactory(
    typeof(PythonProjectFactory),
    "Django Project",
    "Django Project Files (*.myproj);*.myproj",
    "myproj", "myproj",
    @"Templates\Projects\MyProject",
    LanguageVsTemplate="MyProject")]
public sealed class MyPackage : PythonProjectPackage

跑了。但MyProject没有出现在项目模板中。为什么不呢?

生成的.pkgdef文件如下所示:

[$RootKey$\InstalledProducts\VSPackage3Package]
@="#110"
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}"
"PID"="1.0"
"ProductDetails"="#112"
"LogoID"="#400"
[$RootKey$\Packages\{5cd7435c-7461-459f-80bc-c0c79e9d462f}]
@="Microsoft.VSPackage3.VSPackage3Package, VSPackage3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a4f1577d825253f8"
"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL"
"Class"="Microsoft.VSPackage3.VSPackage3Package"
"CodeBase"="$PackageFolder$\VSPackage3.dll"
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}]
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}"
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\Extensions]
"py"=dword:00000020
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\LogicalViews]
"{7651a701-06e5-11d1-8ebd-00a0c90f26ea}"=""
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\LogicalViews]
"{7651a702-06e5-11d1-8ebd-00a0c90f26ea}"=""
[$RootKey$\Editors\{888888c4-36f9-4453-90aa-29fa4d2e5706}\LogicalViews]
"{7651a703-06e5-11d1-8ebd-00a0c90f26ea}"=""
[$RootKey$\CLSID\{888888fd-3c4a-40da-aefb-5ac10f5e8b30}]
@="Microsoft.IronPythonTools.Project.PythonGeneralPropertyPage"
"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL"
"Class"="Microsoft.IronPythonTools.Project.PythonGeneralPropertyPage"
"CodeBase"="$PackageFolder$\VSPackage3.dll"
"ThreadingModel"="Both"
[$RootKey$\Projects\{888888a0-9f3d-457c-b088-3a5042f75d52}]
@="PythonProjectFactory"
"DisplayName"="My Project"
"DisplayProjectFileExtensions"="My Project Files (*.myproj);*.myproj"
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}"
"DefaultProjectExtension"="myproj"
"PossibleProjectExtensions"="myproj"
"ProjectTemplatesDir"="$PackageFolder$\Templates\Projects\MyProject"
"Language(VsTemplate)"="MyProject"
[$RootKey$\NewProjectTemplates\TemplateDirs\{5cd7435c-7461-459f-80bc-c0c79e9d462f}\/1]
@="My Project"
"SortPriority"=dword:00000064
"TemplatesDir"="$PackageFolder$\Templates\Projects\MyProject"
[$RootKey$\Projects\{888888a0-9f3d-457c-b088-3a5042f75d52}]
@="PythonProjectFactory"
"DisplayName"="IronPython"
"DisplayProjectFileExtensions"="IronPython Project Files (*.pyproj);*.pyproj"
"Package"="{5cd7435c-7461-459f-80bc-c0c79e9d462f}"
"DefaultProjectExtension"="pyproj"
"PossibleProjectExtensions"="pyproj"
"ProjectTemplatesDir"="$PackageFolder$\.\NullPath"
"Language(VsTemplate)"="IronPython"
[$RootKey$\NewProjectTemplates\TemplateDirs\{5cd7435c-7461-459f-80bc-c0c79e9d462f}\/1]
@="IronPython"
"SortPriority"=dword:00000064
"TemplatesDir"="$PackageFolder$\.\NullPath"
[$RootKey$\Services\{b98e41c4-581e-3532-beee-06829b683d39}]
@="{5cd7435c-7461-459f-80bc-c0c79e9d462f}"
"Name"="IPythonStarter"

我只是想让骨架运行起来,所以我可以开始覆盖一些功能(比如Add New Item对话框)。

3 个答案:

答案 0 :(得分:5)

<强>更新

ProvideProjectFactoryAttribute Class的MSDN文档中再次阅读我的初步分析,再次增加了我对缺少某些必需组件(例如专用ProjectFactory)和/或错误连接的印象。 / p>

  

ProvideProjectFactoryAttribute 声明包提供项目工厂。

进一步说:

  

如果VSPackage声明它提供了一个项目工厂,它应该创建工厂并在Package-derived类的Initialize方法中将它提供给Visual Studio。

你的软件包声明提供PythonProjectFactory,但(很可能)不提供给VS,而是由IronPython软件包提供。反过来,您在ProvideProjectFactory属性列表中提供了PythonProjectFactory在VS要求时不知道的参数。

因此,根据演练,您至少应该自己提供一个专用的ProjectFactory,相应地对课程进行连线,并了解如何解决以下问题。


初步分析:

乍一看似乎有几个问题 - 您是否遵循了有关如何执行此操作的任何教程?在这种情况下,请注意,通过搜索引擎可轻松发现的一些内容仍然过时。无论哪种方式,我都会尝试使用VS 2010的MSDN文档中的Walkthrough: Part 1 - Creating a Basic Project System来完成和/或比较您的结果;请注意,根据页面底部的社区内容部分,即使这个声称已经过时了。

根据您提供的代码,我会根据自己的演练进行比较,以获得更多见解:

  • 您已经意识到从PythonProjectFactory上方的GUID开始的重复片段没有意义 - 这实质上是尝试一次注册两个包,这甚至如果在语法上允许(我怀疑),由于两者都使用相同的GUID注册,因此无法正常工作[与中的示例文件进行交叉检查检查模板注册确认了这种怀疑,正如所料,只有一个这样的片段]。

    • 请注意,相关的GUID是标识PythonProjectFactory的GUID(根据相应的源代码),有关详情,请参阅下文。
        [Guid(PythonConstants.ProjectFactoryGuid)]
        public class PythonProjectFactory : ProjectFactory {
  • 鉴于.pkgdef是生成的文件,下一个问题是此重复/违规源自何处。当两个生成的工件最终具有相同的GUID时,源中的相应定义很可能以某种方式混淆,通常是由于复制和粘贴复制。因此,您应该验证 {5cd7435c-7461-459f-80bc-c0c79e9d462f} 是否按预期定义和引用,尽管这可能是一个或两个其他原因,请参见下文。

  • 需要通过GUID标识Package class,VS向导会在Guids.cs中生成一些并在类定义中相应地引用它,但是,缺少以下内容在您的片段中[与部分中的样本片段交叉检查注册项目模板也确认了这一遗漏]:

    [Guid(GuidList.guidMyPackagePkgString)]
    public sealed class MyPackage : Package
  • 同样,从MyPackage导出PythonProjectPackage参考PythonProjectFactory仍然而不是提供MyFactory似乎不正确(包括一个专用的GUID),因为后者告诉Visual Studio项目模板文件夹的位置 [参见创建骨架项目工厂部分]:

    • 尽管可以简单地重用基类PythonProjectFactory中的所有功能,但可能只需要继承,因为工厂也必须具有专用的GUID(如演练中所述)才能正确连接向上指定属性的数据。

  • 可能无关,但仍然可疑的是您的两个代码块不相关,因为Package class定义指定了 Django项目文件(* .myproj) ; * .myproj ,但结果显示我的项目文件(* .myproj); * .myproj

    • 您是否偶然将其与不同版本混合在一起,或者这真的是一个干净的结果吗?
祝你好运!

答案 1 :(得分:1)

此stackoverflow发布可能会有所帮助:VS2010: VSIX installation doesn't deploy item templates inside it

如果这不是您想要的,请尝试查看您是否遗漏了创建自定义项目模板的内容,我相信这是“缺少链接”的地方:

希望这有帮助

答案 2 :(得分:0)

$ PackageFolder $。\ NullPath可能与它有关。