问题描述
我创建了一个 Visual Studio multi-project template,其中一个是“共享”项目,另一个是公共“资源”的普通项目。其他 5 个普通项目都需要引用“共享”和“资源”项目。
在一个单独的解决方案中,我 create a VISX extension to implement a wizard,但不是将 .vsixmanifest Asset 指向“当前解决方案中的项目”,而是指向我创建的 .zip 多项目模板。
我的意图是然后使用 vsix 向导添加必要的项目引用。 I've already done so with envDTE,而且效果很好......主要是。
添加对“资源”项目的引用没有问题。问题是在尝试添加“共享”项目作为参考时。我已经尝试使用 (Project) 和 (Filename.shproj) 参数。
DTE VS = automationObject as DTE;
// This method is called after the solution is created.
public void RunFinished()
DTE VS = automationObject as DTE;
{
Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
Project sharedProj = null;
Project resourceProj = null;
List<Project> versionProjs = new List<Project>();
foreach (Project project in VS.solution.Projects)
{
if (project.Name.Contains("Resources")) { resourceProj = project; }
else if (project.Name.Contains("Shared")) { sharedProj = project; }
else { versionProjs.Add(project); }
}
foreach (Project version in versionProjs)
{
// Add reference to shared project
VSProject vsProj = (VSProject)version.Object;
if (sharedProj != null)
{
// !!! Shared project should be added as a reference here,but it is causing a critical error. !!!
//BuildDependency bldDepends = VS.solution.solutionBuild.BuildDependencies.Item(version.UniqueName);
//bldDepends.AddProject(sharedProj.FileName);
//vsProj.References.Add(sharedProj.FileName);
//vsProj.References.AddProject(sharedProj);
}
// Add reference to the Resources project
if (resourceProj != null) { vsProj.References.AddProject(resourceProj); }
}
}
AddProject(Project) 结果:
异常抛出:'System.Runtime.InteropServices.COMException' in 模板扩展.dll
灾难性故障(来自 HRESULT 的异常: 0x8000FFFF (E_UNEXPECTED))
AddProject(Filename.shproj) 结果:
抛出异常:'System.Runtime.InteropServices.COMException' in 模板扩展.dll
请确保文件可访问, 并且它是一个有效的程序集或 COM 组件。
编辑 1
我决定向公众开放我的项目。可以在此处找到此问题的源代码:https://github.com/theBIMdev/RevitExtension
有问题的代码特别是在 Wizard.cs file. 注释掉的部分代表 3 种不同的尝试。
- 将项目添加到依赖项
- vsProj.References.Add(sharedProj.FileName);
- vsProj.References.AddProject(sharedProj);
解决方法
如果没有通过 repro 进行调试,我最初怀疑共享项目类型可能不支持该特定操作。
话虽如此,您无需以编程方式尝试添加引用,而只需将项目引用添加到需要它们的模板化项目文件中即可。
几年前我做了类似的事情,在那里我利用 ReplacementsDictionary 将我需要的自定义项目名称交换到各种项目文件中。可悲的是,我在一段时间前丢失了该代码,但这可能会给您提供一个可选的解决方案。即,考虑通过模板化的项目文件添加对共享项目的引用。
真诚的