我想基于IronStudio添加自己的项目类型。所以,
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对话框)。
答案 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注册,因此无法正常工作[与中的示例文件进行交叉检查检查模板注册确认了这种怀疑,正如所料,只有一个这样的片段]。
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可能与它有关。