如何检查 roslyn 中的 CSharpCompilation 引用依赖关系(而不尝试发出)?

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

在Unity中使用roslyn,我创建了一个CSharpCompilation实例。我使用以下代码添加了对实例的

Microsoft.CodeAnalysis.dll
引用

byte[] microsoftCodeAnalysisBytes = 
                Resources.Load<TextAsset>("CompilationReferences/Microsoft.CodeAnalysis.dll").bytes;
            testAdhocWorkspaceCSharpCompilation =
                testAdhocWorkspaceCSharpCompilation.AddReferences(
                    MetadataReference.CreateFromImage(microsoftCodeAnalysisBytes)
                    );

上面的代码有效并且没有抛出任何错误,我什至可以将

using Microsoft.CodeAnalysis;
添加到 CSharpCompilation 内的代码中。然而,
Microsoft.CodeAnalysis.dll
实际上对其他dll有很多依赖,并且我没有添加对依赖项的引用,因此如果我尝试发出它,CSharpCompilation将无法编译。

在不尝试发出 CSharpCompilation 的情况下,如何检查 CSharpCompilation 中引用的 dll 的 dll 依赖性?

c# unity-game-engine dll dependencies roslyn
1个回答
0
投票

要检查 CSharpCompilation 中的 DLL 依赖项而不尝试发出它,您可以使用 GetMetadataReference 方法来检查元数据引用及其依赖项。这是一种方法:

  • 检索元数据引用:从 CSharpCompilation 获取元数据引用。
  • 检查程序集元数据: 使用 MetadataReader 检查程序集元数据并查找依赖项。

这里有一个示例代码片段来说明这一点:

using System;
using System.Collections.Generic;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

public static void CheckDependencies(CSharpCompilation compilation)
{
    foreach (var reference in compilation.References)
    {
        if (reference is PortableExecutableReference peReference)
        {
            using (var stream = peReference.GetMetadata().GetStream())
            using (var peReader = new PEReader(stream))
            {
                var metadataReader = peReader.GetMetadataReader();
                foreach (var assemblyRefHandle in metadataReader.AssemblyReferences)
                {
                    var assemblyRef = metadataReader.GetAssemblyReference(assemblyRefHandle);
                    var assemblyName = metadataReader.GetString(assemblyRef.Name);
                    Console.WriteLine($"Dependency: {assemblyName}");
                }
            }
        }
    }
}

在此代码中:

  • 我们迭代 CSharpCompilation 中的元数据引用。
  • 对于每个 PortableExecutableReference,我们使用 PEReader 和 MetadataReader 来读取程序集元数据。
  • 然后,我们提取并打印引用的程序集的名称。

这种方法允许您在不发出编译的情况下检查依赖关系。如果您需要有关每个依赖项的更多详细信息,您可以使用 MetadataReader 进一步探索元数据

没有内部可见,没有问题绕过 c 可见性规则与 roslyn

如何_do_i_actually_add_references_to_a_net_6

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