Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 以编程方式发布web应用程序_Visual Studio 2010_Vsx_Envdte - Fatal编程技术网

Visual studio 2010 以编程方式发布web应用程序

Visual studio 2010 以编程方式发布web应用程序,visual-studio-2010,vsx,envdte,Visual Studio 2010,Vsx,Envdte,我正在尝试编写一个VisualStudio扩展,它允许我在一个解决方案中发布多个web应用程序,类似于在所有项目上使用一键发布功能 DTE2 service = (DTE2)this.GetService(typeof(DTE)); Projects projects = service.Solution.Projects; SolutionBuild2 build = (SolutionBuild2)service.Solution.SolutionBuild; foreach (Proje

我正在尝试编写一个VisualStudio扩展,它允许我在一个解决方案中发布多个web应用程序,类似于在所有项目上使用一键发布功能

DTE2 service = (DTE2)this.GetService(typeof(DTE));
Projects projects = service.Solution.Projects;
SolutionBuild2 build = (SolutionBuild2)service.Solution.SolutionBuild;

foreach (Project project in projects)
{
   build.PublishProject("Release", project.UniqueName, true);
}
当我尝试运行此代码时,输出窗口中的唯一结果是:

Error: Object reference not set to an instance of an object.
========== Publish: 0 succeeded, 0 failed, 0 skipped ==========
。。。这并不能告诉我太多。有没有办法找出哪里出了问题

我也看到了一个界面,但似乎没有任何关于如何使用它的例子


是否有另一种方式以编程方式将web应用程序发布到特定目录,类似于一键发布功能的工作方式?

另一种方式是模拟在解决方案资源管理器中单击右键单击“发布”上下文菜单项,如此类似问题所示:


请注意,由于这是一个异步命令,您将需要内置逻辑以点击发布后事件来迭代您的项目集合(其中一个答案中显示了有关这一点的详细信息)。

使用msbuild.exe可执行文件(这就是您构建的方式),将sln文件作为项目参数传递,并以“发布”目标为目标

您可以在命令行中声明某些属性,也可以使用自己的.targets文件静态声明它们;在.csproj中引用此.targets文件

<Import Project="MyPublishCustomizations.targets" />

.targets文件的内容可能如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Publish">
    </Target>
    <!-- or .. -->
    <Target Name="CustomPublish" BeforeTargets="Publish">
    </Target>
</Project>
msbuild.exe "MyProject.csproj" /p:PublishProfile="MyPublishProfile.pubxml" /p:DeployOnBuild=true /p:VisualStudioVersion="14.0"

。。然后,
XML就可以包含在其中

<PropertyGroup>
    <MyCustomPath>\\our_server\our_share</MyCustomPath>
</PropertyGroup>
<Copy SourceFiles="$(OutDir)\*" DestinationFiles="$(MyCustomPath)" />

\\我们的\u服务器\u共享
然后,您可以使用
定义任何其他MSBuild任务,甚至shell命令

在MSBuild上更一般的情况如下:

此外,如果您坚持在C语言中编写发布逻辑,则可以考虑上面描述的路径并定义自定义MSBuw任务,即



了解方法。

基本上,它归结为以某种方式调用msbuild,如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Publish">
    </Target>
    <!-- or .. -->
    <Target Name="CustomPublish" BeforeTargets="Publish">
    </Target>
</Project>
msbuild.exe "MyProject.csproj" /p:PublishProfile="MyPublishProfile.pubxml" /p:DeployOnBuild=true /p:VisualStudioVersion="14.0"

我已经为此编写了PowerShell cmdlet,我可以从NuGet package manager控制台调用它。

如果您告诉我们哪一行引发异常,可能会有所帮助。您是否尝试使用调试器单步执行?它不会引发异常。当我尝试在实验性VisualStudio中使用扩展时,它只是将错误消息写入输出窗口。我可以成功地一步一步地浏览所有行,而不会引发任何异常。当你一步一步地浏览时,它是否真的发布了任何项目?不,它没有。实验性Visual Studio中的输出窗口包含错误消息,并且尚未发布任何项目。请举例说明如何使用指定的cmdlet从C#以编程方式运行此命令?@Jacob如前所述,我创建该cmdlet用于从控制台调用msbuild。如果要从C#调用msbuild,它可能类似于
Process.Start(“msbuild.exe”、“MyProject.csproj/p:PublishProfile=…”