簡體   English   中英

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 的問題

[英]Problem with Microsoft.CodeDom.Providers.DotNetCompilerPlatform

我有一個執行一些動態代碼生成和編譯的應用程序,並且與 System.CodeDom 和 Microsoft.CSharp 配合得很好。 我將其移植到 .net Core 3.1,因此已升級為使用 Microsoft.CodeDom.Providers.DotNetCompilerPlatform。 但是,我遇到了可能相關的問題。 首先是 Visual Studio 在“參考資料”的“包”部分顯示以下消息:

使用“.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4”恢復包“Microsoft.CodeDom.Providers.DotNetCompilerPlatform 2.0.1” .7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' 而不是項目目標框架 '.NETCoreApp,Version=v3.1'。 此包可能與您的項目不完全兼容。

其次(這可能是相關的),當應用程序點擊這條線時:

CSharpCodeProvider codeProvider = new CSharpCodeProvider();

然后拋出以下異常:

“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CompilationSettingsHelper”的類型初始值設定項引發異常。

我將不勝感激任何幫助!

希望這可以幫助其他人嘗試解決同樣的問題,這是我最終使用 Microsoft.CodeAnalysis.CSharp 包的結果:

Assembly assembly = null;
string[] sourceStringArray = null;// set this to hold the arrary of source strings
List<SyntaxTree> syntaxTreeList = new List<SyntaxTree>();
foreach (string sourceString in sourceStringArray)
{
    SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(sourceString);
    syntaxTreeList.Add(syntaxTree);
}

string assemblyName = Path.GetRandomFileName();
AppDomain currentDomain = AppDomain.CurrentDomain;
List<MetadataReference> metadataReferenceList = new List<MetadataReference>();
Assembly[] assemblyArray = currentDomain.GetAssemblies();
foreach (Assembly domainAssembly in assemblyArray)
{
    try
    {
        AssemblyMetadata assemblyMetadata = AssemblyMetadata.CreateFromFile(domainAssembly.Location);
        MetadataReference metadataReference = assemblyMetadata.GetReference();
        metadataReferenceList.Add(metadataReference);
    }
    catch (Exception e)
    {
        Log.DebugFormat("failed to get MetadataReference {0}", e.Message);
    }
}

CSharpCompilation compilation = CSharpCompilation.Create(
    assemblyName,
    syntaxTrees: syntaxTreeList,
    references: metadataReferenceList,
    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using (var ms = new MemoryStream())
{
    EmitResult result = compilation.Emit(ms);
    if (!result.Success)
    {
        IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error);
        foreach (Diagnostic diagnostic in failures)
        {
            /* Process failures */
        }
    }
    else
    {
        ms.Seek(0, SeekOrigin.Begin);
        assembly = Assembly.Load(ms.ToArray());
    }
}

我確信這不是最優的(並且歡迎提出改進建議。)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM