首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.CodeDom.Providers.DotNetCompilerPlatform问题

Microsoft.CodeDom.Providers.DotNetCompilerPlatform问题
EN

Stack Overflow用户
提问于 2019-12-13 17:51:17
回答 1查看 1.8K关注 0票数 2

我有一个应用程序,它可以进行一些动态代码生成和编译,并且一直很好地使用System.CodeDom和Microsoft.CSharp。我正在将它移植到.net Core3.1,因此已经升级到使用.net然而,我遇到了一些可能相关的问题。第一个是Visual在引用的Packages部分中显示以下消息:

使用‘'Microsoft.CodeDom.Providers.DotNetCompilerPlatform,Version=v4.6.1,.NETFramework,Version=v4.6.2,.NETFramework,Version=v4.7,.NETFramework,Version=v4.7.1,.NETFramework,Version=v4.7.2,.NETFramework,Version=v4.8’恢复了项目目标框架'.NETCoreApp,Version=v3.1‘。此软件包可能与您的项目不完全兼容。

其次(这可能是相关的),当应用程序碰到这一行时:

代码语言:javascript
复制
CSharpCodeProvider codeProvider = new CSharpCodeProvider();

然后引发以下异常:

'Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CompilationSettingsHelper‘的类型初始化程序

引发了一个异常。

我很感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2019-12-16 21:54:11

希望这可以帮助其他试图解决同样问题的人,下面是我最后使用的Microsoft.CodeAnalysis.CSharp包:

代码语言:javascript
复制
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());
    }
}

我相信这并不是最理想的做法(欢迎提出改善的建议!)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59327559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档