所以我有一个 C# 类库项目,我只打算在 Windows 上使用。它包含一些使用System.Drawing.Image
仅在 Windows 上可用的类的类。升级到 Visual Studio 2022 并将目标框架设置为 .NET 6.0 后,我看到一堆警告:
\n\n\n
CA1416
“此调用站点可在所有平台上访问。\'SomeClass.SomeMethod\' 仅在以下平台上受支持:\'windows\'。
请参阅下面的屏幕截图了解一些示例:
\n\n从某种意义上说,VS2022 扫描了库并找到了我在库中使用的所有平台特定代码,这很酷。但我想告诉 VS,我只打算在 Windows 上使用该库,它可以消除所有这些警告。
\n首先,我检查了Target framework
项目属性中的选项,但没有看到任何 Windows 特定目标。
然后我决定直接编辑项目.csproj
并更改Target framework
<TargetFramework>net6.0</TargetFramework>\n
Run Code Online (Sandbox Code Playgroud)\n到
\n<TargetFramework>net6.0-windows</TargetFramework>\n
Run Code Online (Sandbox Code Playgroud)\n但是,遗憾的是,即使在重新编译之后,警告也没有消失。然后我读了一些警告CA1416
,果然Microsoft Docs中说,评估此警告时会忽略目标框架名称,但是,VS 确实根据影响此警告的 TFM 向项目添加了一个属性,但是仅当项目配置为AssemblyInfo.cs
动态生成文件时,它才会这样做。但是,唉,我的项目是AssemblyInfo.cs
作为实际文件维护的,而不是在构建时自动生成的。
因此,此时,我已准备好踢球并禁用CA1416
我的项目的警告。因此,在项目的.proj
文件中,我添加了CA1416
发布和调试版本,如下所示:
<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Debug|AnyCPU\'">\n <NoWarn>1701;1702;CA1416;</NoWarn>\n</PropertyGroup>\n\n<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Release|AnyCPU\'">\n <NoWarn>1701;1702;CA1416;</NoWarn>\n</PropertyGroup>\n
Run Code Online (Sandbox Code Playgroud)\n … c# code-analysis visual-studio microsoft.codeanalysis .net-6.0
我正在发布一个 ASP.NET Core MVC 3.0 网站,输出文件夹包含许多语言的库引用Microsoft.CodeAnalysis
,有人知道为什么吗?
当然FxCopAnalyzers
,项目中安装了Nuget 包,但它没有在项目的早期版本中发布,所以我不明白为什么现在它应该只在开发时有用,而不是在生产环境中使用。
我正在尝试将Microsoft.CodeAnalysis.FXCopAnalyzers(最新稳定版本)添加到我的 ASP.NET 项目中。当我通过 NuGet 安装它时,我收到了大量错误,例如:
无法从 \packages\Microsoft.CodeQuality.Analyzers.2.6.3\analyzers\dotnet\cs\Microsoft.CodeQuality.Analyzers.dll 创建分析器 Microsoft.CodeQuality.Analyzers.ApiDesignGuidelines.AbstractTypesShouldNotHaveConstructorsAnalyzer 的实例:无法加载文件或程序集'Microsoft.CodeAnalysis, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。系统找不到指定的文件。无法从 \packages\Microsoft.CodeQuality.Analyzers.2.6.3\analyzers\dotnet\cs\Microsoft.CodeQuality.Analyzers 创建分析器 Microsoft.CodeQuality.Analyzers.ApiDesignGuidelines.AvoidEmptyInterfacesAnalyzer 的实例.dll:无法加载文件或程序集“Microsoft.CodeAnalysis,版本=2.6.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。系统找不到指定的文件。无法从 \packages\Microsoft.CodeQuality.Analyzers.2.6.3\analyzers\dotnet\cs\Microsoft.CodeQuality.Analyzers 创建分析器 Microsoft.CodeQuality.Analyzers.ApiDesignGuidelines.CancellationTokenParametersMustComeLastAnalyzer 的实例.dll:无法加载文件或程序集“Microsoft.CodeAnalysis,版本=2.6.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。该系统找不到指定的文件.. 版本=2.6.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。该系统找不到指定的文件.. 版本=2.6.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。该系统找不到指定的文件..
注意:为了简洁起见,我省略了 127 个错误。它们都非常相似。但需要注意的一件事是,并非所有分析器都在 Microsoft.CodeQuality 命名空间中。有些在 Microsoft.NetCore 中,有些在 Microsoft.NetFramework 中。
所以我说好的,我必须先安装Microsoft.CodeAnalysis v2.6.0.0。看起来很奇怪,这不是 NuGet 自动安装的依赖项,但无论如何。
所以我恢复了我在 Git 中的所有更改,重新打开解决方案,安装 Microsoft.CodeAnalysis v2.6.0.0,然后安装 Microsoft.CodeAnalysis.FXCopAnalyzers 的最新稳定版本。
同样的错误!
当我查看包/Microsoft.CodeAnalysis.2.6.0 时,我注意到那里没有 .dll 。安装它的正确方法是什么?安装 Microsoft.CodeAnalysis 甚至是正确的解决方案吗?为什么安装时没有自动安装Microsoft.CodeAnalysis.FXCopAnalyzers的依赖?这不是包管理器的全部意义吗?我的问题太多,答案太少。请帮忙。
我试图首次针对我们的许多不同解决方案运行代码分析.每次我收到CA0055
错误("无法加载目标"),尽管目标文件确实存在.
我查看了CodeAnalysis日志,但我无法弄清楚它无法做到的事情.
我在Windows 10上运行Visual Studio 2015(Update 3),但我在VS2013上也遇到了这个问题.该项目是一个针对.NET 4.6.2的ASP.NET Web Forms应用程序,但是是从ASP.NET WebForms 2.0开发的.我在控制台应用程序上也遇到了同样的问题.
Exception堆栈跟踪看起来如下所示 - 我知道它可能并不多,但看起来像加载引用的某种问题可能?
我很感激任何建议 - 谢谢.
<Exception Keyword="CA0055" Kind="AssemblyLoad">
<Type>Microsoft.FxCop.Common.AssemblyLoadException</Type>
<ExceptionMessage>Could not load c:\PathToFile\FileBeingAnalysed.dll.</ExceptionMessage>
<InnerType>System.NullReferenceException</InnerType>
<InnerExceptionMessage>Object reference not set to an instance of an object.</InnerExceptionMessage>
<InnerStackTrace> at Microsoft.FxCop.Sdk.TypeNode.GetNestedType(Identifier name)
at Microsoft.FxCop.Sdk.Duplicator.VisitTypeReference(TypeNode type)
at Microsoft.FxCop.Sdk.Duplicator.VisitTypeNode(TypeNode type, Identifier mangledName, TypeNodeCollection templateArguments, TypeNode template, Boolean delayVisitToNestedTypes)
at Microsoft.FxCop.Sdk.TypeNode.GetTemplateInstance(ModuleNode module, TypeNode referringType, TypeNode declaringType, TypeNodeCollection templateArguments)
at Microsoft.FxCop.Sdk.TypeNode.GetGenericTemplateInstance(ModuleNode module, TypeNodeCollection consolidatedArguments)
at Microsoft.FxCop.Sdk.Reader.ParseTypeSignature(MemoryCursor sigReader, Boolean& pinned, Boolean& isTypeArgument)
at Microsoft.FxCop.Sdk.Reader.GetTypeFromSpec(Int32 …
Run Code Online (Sandbox Code Playgroud) vb.net code-analysis visual-studio-2015 microsoft.codeanalysis
更新到 Visual Studio 2017 的 6 月 21 日更新后,我无法再构建我的项目。
我收到 BadImageException,Microsoft.CodeAnalysis 上的签名不正确。
我尝试清理解决方案,重新启动计算机,修复 Visual Studio 2017(和 resharper)(按此顺序)。
我可以在发布中构建,但不能在调试中构建。显然,这对我来说是个问题。
如何撤消最新的 Visual Studio 2017 更新?在 Visual Studio 2015 中,您曾经可以简单地撤消更新,但在 Visual Studio 2017 中,这似乎被掩盖了。
我似乎从 Visual Studio 2019(16.5 预览版,但也在 16.4 及更早版本中)代码分析工具收到错误警告消息。这是一个错误,还是我真的只是错过了什么?
生成的警告(确切地说)是:
警告 C6385:从“prodlist”读取无效数据:可读大小为“(size_t)*32+8”字节,但可以读取“64”字节。
这是生成警告的代码(尽可能少)
#include <cstdint>
#include <string>
#include <iostream>
struct Product {
std::string price_profile;
};
int getNumRows() {
return 5;
}
Product *getProductsFromDB( int &numelements ) {
numelements = 0;
const int num_rows = getNumRows();
if ( num_rows == 0 ) {
numelements = 0;
return nullptr;
}
Product *prodlist = new Product[num_rows];
for ( int i = 0; i < num_rows; ++i ) {
prodlist[i].price_profile = "test"; // Warning on this …
Run Code Online (Sandbox Code Playgroud) 我正在等待的 lambda 中对引用类型变量进行初始赋值,如下所示:
private class TestClass {
public int TestInt;
}
public async Task TestMethod() {
TestClass testVar;
await Task.Run(() => {
testVar = new();
});
var testInt = testVar.TestInt;
}
Run Code Online (Sandbox Code Playgroud)
但是,最后一行给出错误“使用未分配的局部变量'testVar'”。是否存在技术原因导致 C# 的代码分析无法确定该变量已保证在该点被赋值?!
在我第一次使用的地方使用操作符有点烦人testVar
。如果我需要首先在等待的 lambda 中分配变量,并且不能方便地给它默认分配(这是一个相当复杂的类),有什么方法可以解决这个问题?
我想在代码生成器中实现接口,因此我需要转换Microsoft.CodeAnalysis.Accessibility
(即从ISymbol.DeclaredAccessibility
)到它们所表示的修饰符关键字。
该枚举在代码分析 API 中用于描述类或其成员的访问修饰符。
例如,如果你有public void MyMember()
它的ISymbol.DeclaredAccessibility
意志Accessibility.Public
。我需要创建这样的方法声明,因此我需要一种转换Accessibility.Public
为public
等的方法(请注意, justToLower
只适用于简单的情况,它不会生成protected internal
)。
正确的做法是什么?
鉴于:
使用简单的语法walker我想访问trivias(确切地说是EndOfLineTrivia)
public sealed class MyWalker : SyntaxWalker
{
public int Lines { get; set; }
public int Trivia { get; set; }
public int Node { get; set; }
public override void Visit(SyntaxNode node)
{
Node++;
base.Visit(node);
}
protected override void VisitTrivia(SyntaxTrivia trivia)
{
Trivia++;
base.VisitTrivia(trivia);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样叫沃克:
SyntaxTree node = CSharpSyntaxTree.ParseText(sourceCode);
var root = node.GetRoot();
var walker = new LocWalker();
Run Code Online (Sandbox Code Playgroud)
问题
永远不会调用重写的VisitTrivia方法.
我有这个步行者
internal class MyWalker : CSharpSyntaxWalker
{
public int MethodCount { get; private set; }
public MyWalker() : base(Microsoft.CodeAnalysis.SyntaxWalkerDepth.Trivia)
{ }
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
MyMethodCount ++;
}
public override void VisitClassDeclaration(ClassDeclarationSyntax node)
{
Class++;
Complexity++;
}
}
Run Code Online (Sandbox Code Playgroud)
我用这段代码给walker打电话
var code = @"
public class foo
{
public void MyMethod()
{
}
}
";
SyntaxTree node = CSharpSyntaxTree.ParseText(source);
var root = node.GetRoot();
var walker = new MyWalker();
walker.Visit(root);
Run Code Online (Sandbox Code Playgroud)
但从未调用过访问MethodDeclaration.
为了确保我与SyntaxTree Analyzer进行比较,我可以看到roslyn应该将其识别为Method声明.
我错过了什么?
我一直在使用RoslynCodeEditor控件并试图找到一种方法将我的全局对象传递给RoslynCodeEditor并在我的脚本中有intellisense.
有没有人知道在使用RoslynCodeEditor控件编辑脚本时如何授予对上下文对象属性或方法的访问权限?
MyContext context = new MyContext();
context.Data = data;
ScriptOptions scriptOptions = ScriptOptions.Default;
scriptOptions = scriptOptions.WithReferences(ReferencesAndImports.References);
scriptOptions = scriptOptions.WithImports(ReferencesAndImports.Imports);
var scriptState = await CSharpScript.EvaluateAsync<string>("int i = 0;", scriptOptions, context, typeof(MyContext));
Run Code Online (Sandbox Code Playgroud)