我们使用TeamCity(9.0.1)作为构建服务器,但最近升级了我们的ASP.NET MVC解决方案以使用VS2015和C#6语法,现在我在构建服务器上收到以下错误消息:
无法启动构建运行器
更具体地说:
C:\ TeamCity\buildAgent\work\86ee61c6c333dc3d\MyApplication\MyApplication.csproj.metaproj:错误MSB4025:无法加载项目文件.找不到文件'C:\ TeamCity\buildAgent\work\86ee61c6c333dc3d\MyApplication\MyApplication.csproj.metaproj'.
我在几个不同的帖子中遵循了建议(尽管这些主要是TFS专注而不是TeamCity,并且不直接引用缺少的".metaproj"文件):
总而言之,我对Build Server进行了以下更改:
来自:
msbuild'..\MyApplication.sln'/ t:Build/p:Configuration = Release/p:RunCodeAnalysis = Always /p:VisualStudioVersion=12.0
致:
msbuild'..\MyApplication.sln'/ t:Build /tv:14.0/p:GenerateBuildInfoConfigFile = false/p:Configuration = Release/p:RunCodeAnalysis = Always/p:VisualStudioVersion = 14 .0
注意:
如果我登录构建服务器并尝试使用VisualStudio 2015编译解决方案,那么这很好.
在上面提到的一个帖子中,它讨论了从"TfvsTemplate.11.1.xaml"升级到"TfvsTemplate.12.xaml".但据我所知,我不会使用或参考这个.也许我在这里弄错了,在这种情况下,我们将非常感激地接受下一步该做什么的白痴指南.
在Visual Studio扩展(VSIX)解决方案中,我使用Roslyn从当前解决方案加载特定项目:
Project myProject =
this.CurrentComponentModel.GetService<VisualStudioWorkspace>()
.CurrentSolution.Projects
.FirstOrDefault(p => p.Name == "MyProject")
Run Code Online (Sandbox Code Playgroud)
proProct myProject肯定是加载的,但在检查时我看到:
myProject.HasDocuments == false
myProject.Documents is Empty
Run Code Online (Sandbox Code Playgroud)
然而,在Visual Studio中,我可以看到大量文档.
如果我关闭解决方案并从另一个TFS分支打开相同的解决方案,则相同的代码返回:
myProject.HasDocuments == true
myProject.Documents is not Empty
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
c# visual-studio visual-studio-extensions roslyn roslyn-code-analysis
(更新-见下文)
我有一个ASP.NET MVC5应用程序(多个程序集),都解决了.NET Full Framework 4.7.1的问题。
我最近添加了一个使用.NET Standard 2构建的(私有)NuGet软件包。从快速入门:使用Visual Studio(.NET Framework)创建和发布一个软件包:
除非您有其他选择,否则.NET Standard是NuGet软件包的首选目标,因为它提供了与最广泛使用项目的兼容性。
从那以后,事情就变得不一样了.....下面列出了一系列错误,但是我怀疑它们都是同一问题的征兆(最后讨论)。
请注意:我使用的是Visual Studio 15.7.1,所有NuGet软件包都使用package.config管理格式,而不是PackageReference。
第一个问题
找不到方法:'System.Collections.ObjectModel.Collection`1 System.Web.Http.HttpConfiguration.get_MessageHandlers()'
我的猜测是,有一个.NET Standard版本的System.Web.Http没有此方法,我的应用程序选择了解决此问题,而不是4.7.1框架。
我通过将以下内容添加到我的web.config文件中来部分解决此问题:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="B03F5F7F11D50A3A" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
我说“部分地”修复了该问题,这可以在我的DEV环境(使用Visual Studio)中运行时解决此问题,但是当发布到我们的QA环境中时,问题仍然存在。有想法该怎么解决这个吗?
注意:MVC项目对System.Net.Http的引用位于以下路径中(它不是NuGet包):
C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net471 \ lib \ System.Net.Http.dll
第二个问题 大会中有两个涉及从各种Web来源(WCF,Web-api,Web服务)提取数据。在发布模式下(在我已打开代码分析等的情况下)编译它们时,收到以下错误报告:
试图加载格式错误的程序集:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.7.1 \ Facades …
[2019 年 7 月 16 日编辑#1] 我很困惑。我正在尝试一个 .NET Core 3.x Web 应用程序,我想在其中使用:
我已经让 TypeScript 工作了,但它拒绝理解 jQuery '$' 符号。
我已经通过 NuGet 添加了“DefinitelyTyped”库,但没有任何乐趣。
我认为我的困惑在于我应该如何添加这些客户端库。我尝试添加客户端库(通过右键单击解决方案),并将其放入 libman.json 文件中。还有一种使用package.json(我认为是node)的方法。
我真正想了解的是Visual Studio 2019的首选方式是什么。
关于具体问题(我确实可以通过一些“新手”指导来做到这一点)......
在依赖项下,我现在有:
NPN
努格特
然后,在脚本下我有 example.ts
var example = {
showGreeting: function(): void {
alert("Hello user");
let x: any = $('abc');
}
};
example.showGreeting();
Run Code Online (Sandbox Code Playgroud)
(这是无法识别“$”符号的地方)
tsconfig.json
{
"compilerOptions": {
"noImplicitAny": true,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es5" …Run Code Online (Sandbox Code Playgroud) 我创建了一个 Visual Studio 扩展 (VSIX),它使用 Roslyn 更改我们的应用程序代码。
VSIX 解决方案包括 NUGET 包 Microsoft.CodeAnalysis.Analyzers。顺便说一句,它被描述为版本 1.3.2,但底层 DLL(例如“Microsoft.CodeAnalysis.CSharp.dll”)均报告为 1.3.2。
不管怎样,我把这个放在我们当地的私人画廊里。从那里,我可以将其添加到 Visual Studio (VS2015 Update 3),它会按预期执行。
然而,当我的同事将其添加到他们的 Visual Studio (VS2015 Update 3) 并尝试执行它后,他们收到以下消息:
微软视觉工作室
无法加载文件或程序集“Microsoft.VisualStudio.LanguageServices,Version=1.3.1.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。该系统找不到指定的文件。
好的
当我查看 VSIX 存档时,我确实看到了许多 DLL,但这些是“我的 DLL”以及所有带有前缀“System.”的 DLL。我没有看到任何带有前缀“Microsoft”的内容。我确实尝试手动将 BIN 文件夹中的每个 DLL 复制到 VSIX,看看是否会产生任何影响,但没有成功。
所有引用的 DLL 似乎都具有“本地复制”,因此它们位于我的 BIN 中,但在最终用户的计算机上无法访问它们。
我看到清单可以包含“资产”和“依赖项”,但目前还不清楚这些是否可以用于 NUGET 包。
我缺少什么?
我在构建服务器上安装了Visual Studio 2017的MSBuild(15.4.0)工具.为此,我使用了Visual Studio Downloads中标题为"Visual Studio 2017的构建工具"的链接
MSBuild.exe的路径是:
C:\ Program Files(x86)\ Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin
我已将此路径添加到环境变量"路径".
我有一个powershell脚本,以下作为构建任务的主体:
msbuild'..\MyApplication.sln'/ t:Build /tv:15.0/p:GenerateBuildInfoConfigFile = false/p:Configuration = Release/p:RunCodeAnalysis = True /p:VisualStudioVersion=15.0
但是,当执行此操作时(全部由TeamCity处理)我在LOG中找到以下内容:
MSBUILD:错误MSB1040:ToolsVersion无效.工具版本"15.0"无法识别.可用的工具版本是"2.0","3.5","4.0".
该文件表明,15.0应该是正确的.
编辑 从2017 年MSbuild 15中的新功能文档中可以看出:
此版本工具的MSBuildToolsVersion为15.0.程序集版本为15.1.0.0.
但是,2017年文档MSBuild命令行参考指出:
对于MSBuild 4.5,您可以为版本指定以下值:2.0,3.5和4.0.如果指定4.0,则VisualStudioVersion构建属性指定要使用的子工具集.有关更多信息,请参阅Toolset的子工具集部分(ToolsVersion).
所以我对命名法有点困惑:MSBuild 15或MSBuild 4.5 ......?
我有一个指向 .NET 4.7.1 库的 DLL。
可能无关紧要,但它是用 C# 编写的,并且使用“packages.config”模式而不是较新的 PackageReference 配置使用 NuGet 包。
我将它发布为 NuGet 包(多年来一直这样做)。但是现在当我执行以下操作时:
nuget pack -Properties Configuration=Release
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:
错误 NU5128:在 nuspec 和 lib/ref 文件夹的依赖项组中声明的某些目标框架在其他位置没有完全匹配。请参阅以下操作列表: - 将 .NETFramework4.7.1 的依赖项组添加到 nuspec
我在 nuspec 的依赖项组中没有任何内容:
<?xml version="1.0"?>
<package >
<metadata>
<id>*******</id>
<version>*******</version>
<title>*******</title>
<authors>*******</authors>
<owners>*******</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>*******</description>
<releaseNotes>*******</releaseNotes>
<copyright>*******</copyright>
<tags>*******</tags>
</metadata>
</package>
Run Code Online (Sandbox Code Playgroud)
这会消耗以下 NuGet 包:
当我查看参考文献时,我看到以下内容(使用 ~ 来缩短路径):
我正在研究使用VisualStudioWorkspace更新现有代码的Visual Studio扩展(VSIX)中Roslyn编译器的使用。花了近几天的时间进行阅读,似乎有几种方法可以实现此目标。。。我只是不确定哪种方法最适合我。
好的,让我们假设用户在Visual Studio 2015中打开了解决方案。他们单击我的扩展,然后(通过表单)告诉我要向接口添加以下方法定义:
GetSomeDataResponse GetSomeData(GetSomeDataRequest request);
Run Code Online (Sandbox Code Playgroud)
他们还告诉我接口的名称,即ITheInterface。
接口中已经包含一些代码:
namespace TheProjectName.Interfaces
{
using System;
public interface ITheInterface
{
/// <summary>
/// A lonely method.
/// </summary>
LonelyMethodResponse LonelyMethod(LonelyMethodRequest request);
}
}
Run Code Online (Sandbox Code Playgroud)
好的,所以我可以使用以下方法加载接口文档:
Document myInterface = this.Workspace.CurrentSolution?.Projects?
.FirstOrDefault(p
=> p.Name.Equals("TheProjectName"))
?.Documents?
.FirstOrDefault(d
=> d.Name.Equals("ITheInterface.cs"));
Run Code Online (Sandbox Code Playgroud)
那么,现在将我的新方法添加到此现有接口中的最佳方法是什么,最好也写XML注释(三斜杠注释)呢?请记住,请求和响应类型(GetSomeDataRequest和GetSomeDataResponse)可能实际上还不存在。我对此很陌生,所以如果您可以提供代码示例,那将是非常棒的。
更新
我认为最好的方法(可能)只是插入一些文本,而不是尝试以编程方式构建方法声明。
我尝试了以下操作,但最终出现了一个我不理解的异常:
SourceText sourceText = await myInterface.GetTextAsync();
string text = sourceText.ToString();
var sb = new StringBuilder();
// I want to all the text up to and including the last
// method, but …Run Code Online (Sandbox Code Playgroud) 我已经阅读了一些关于Span<T>(and ReadOnlySpan<T>) 以及它们不能用于异步方法的文章。
Jared Parsons 有一段很棒的 Chanel 9 视频,他展示了以下示例:
static async Task<bool> IsCSharpIdentifierAsync(Memory<char> memory, StreamReader reader)
{
var count = await reader.ReadAsync(memory);
return IsCSharpIdentifier(memory.Span.Slice(0, count));
}
static bool IsCSharpIdentifier(ReadOnlySpan<char> value)
{
....
}
Run Code Online (Sandbox Code Playgroud)
因此,整个流程可能是异步的,但如果我们调用使用 Span 的同步方法,我们就可以了。
现在,我已经很少,如果编译左右任何知识,但我明白,编译器可能(在某些情况下),“在线”的方法(即复制从调用的方法到调用方法的代码),以减少的开销方法调用。
我猜答案是“哼哼……当然不是”,但是编译器有没有可能将使用 Span 的方法内联到异步方法中?如果是这样,那会导致我理解的问题......(这包括“本地方法”)
我有一个使用以下框架构建的项目:
<TargetFrameworks>netstandard2.0;netstandard2.1;net5.0</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
这在我的本地计算机上编译得很好,但是当我将其推送到 Azure 时,它失败了。
当我的 YAML 文件中有以下内容时:
variables:
solution: '**/*.sln'
buildConfiguration: 'Release'
buildPlatform: 'Any CPU'
platform: x64
- task: DotNetCoreCLI@2
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration)'
Run Code Online (Sandbox Code Playgroud)
然后我得到:
##[错误]C:\Program Files\dotnet\sdk\3.1.403\Microsoft.Common.CurrentVersion.targets(1177,5): 错误 MSB3644: 找不到 .NETFramework,Version=v5.0 的参考程序集。要解决此问题,请安装此框架版本的开发人员包(SDK/目标包)或重新定位您的应用程序。您可以在 https://aka.ms/msbuild/developerpacks下载 .NET Framework 开发人员包
如果我尝试
- task: VSBuild@1
displayName: 'Build all'
inputs:
solution: '$(solution)'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
maximumCpuCount: true
Run Code Online (Sandbox Code Playgroud)
我得到:
##[错误]C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(1177,5):错误 MSB3644:.NETFramework 的参考程序集,Version=v5.0 未找到。要解决此问题,请安装此框架版本的开发人员包(SDK/目标包)或重新定位您的应用程序。您可以在 https://aka.ms/msbuild/developerpacks下载 .NET Framework 开发人员包
c# ×4
nuget ×3
roslyn ×3
msbuild ×2
.net ×1
.net-5 ×1
asp.net-mvc ×1
async-await ×1
azure-devops ×1
build-server ×1
build-tools ×1
c#-6.0 ×1
client-side ×1
jquery ×1
nuspec ×1
teamcity ×1
tfsbuild ×1
typescript ×1
vsix ×1