在 C# 中以编程方式检查字符串是否包含有效的 C# 代码

问题描述 投票:0回答:2

我有一个包含 C# 代码的字符串。如何检查字符串中的 C# 代码是否有效 C# 并且不包含构建错误?

我想在 C# 中以编程方式执行此操作。

我不希望字符串中的代码包含对字符串之外的其他代码的引用,因此不需要加载整个项目或解决方案,只需要考虑字符串中的代码。

我可以使用 Roslyn Api 或类似的东西吗?

c# roslyn roslyn-code-analysis
2个回答
0
投票

您可以编译它,例如使用这种方法:https://www.kendar.org/?p=/dotnet/sharptemplate你甚至可以在 WaybackMachine 上找到它:P 这是我几年前写的一个库。

您需要的示例如下:

    const string dllName = "CompileClassTemplate";
    const string resultDllName = "CompileResultingTemplate";
    var path = TestUtils.GetExecutionPath();
    var source = ResourceContentLoader.LoadText("ClassTemplate.cs", Assembly.GetExecutingAssembly());

    var pp = new SharpParser();
    var sharpClass = pp.ParseClass(source, "TestParserClass", "SharpTemplate.Test.Resources.Parsers");

    var loadedAssembly = BuildParserClass(dllName, path, sharpClass);

这里是 SharpTemplate NugetGit 存储库


0
投票

这并不能 100% 回答你的问题,但对于像我这样发现这个并且只想检查字符串中是否有效的 C# 的人,你可以使用

Microsoft.CodeAnalysis.CSharp
NuGet 包:

var tree = CSharpSyntaxTree.ParseText(myString);
if (tree.GetDiagnostics().Any())
  // not valid
else
  // valid

但是,这将仅检查语法是否正确。如果你真的可以运行它就不会。

示例

Console.WriteLine(myString);

这行不会导致错误,因为它在语法上是正确的,但你将无法执行它,因为没有变量

myString
。但如果您删除分号,
.GetDiagnostics()
会告诉您行尾缺少分号。

© www.soinside.com 2019 - 2024. All rights reserved.