在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 依赖性?
要检查 CSharpCompilation 中的 DLL 依赖项而不尝试发出它,您可以使用 GetMetadataReference 方法来检查元数据引用及其依赖项。这是一种方法:
这里有一个示例代码片段来说明这一点:
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}");
}
}
}
}
}
在此代码中:
这种方法允许您在不发出编译的情况下检查依赖关系。如果您需要有关每个依赖项的更多详细信息,您可以使用 MetadataReader 进一步探索元数据