Roslyn无法与.net Framework Console应用程序和Docker正常工作。

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

我们有一个问题,通过CSharpCodeProvider执行的简单的c#代码在运行本地命令行和docker时工作不一样。

代码示例如下,当在Roslyn上运行时,它不会返回任何汇编的Types,但在本地工作正常。我真的不知道如何从这里进行调试--欢迎任何帮助!我尝试了下面的docker文件(在Roslyn上运行时没有返回任何汇编的Types,但在本地运行时却很好。

using System;
using Microsoft.CodeDom.Providers.DotNetCompilerPlatform;
using System.IO;
using System.Reflection;
using System.Text;
using System.CodeDom.Compiler;

namespace TestContainerIssue
{
  class Program
  {
    static void Main(string[] args)
    {

      using (var codeProvider = new CSharpCodeProvider())
      {
        var compilerParameters = new CompilerParameters
        {
          GenerateExecutable = false,
          GenerateInMemory = true
        };
        compilerParameters.CompilerOptions = String.Format("/lib:\"{0}\"", Path.GetDirectoryName(Uri.UnescapeDataString((new UriBuilder(Assembly.GetExecutingAssembly().CodeBase)).Path)));
        Console.WriteLine(compilerParameters.CompilerOptions);
        compilerParameters.ReferencedAssemblies.Add("System.dll");
        compilerParameters.ReferencedAssemblies.Add("System.Core.dll");

        CompilerResults compilerResults = codeProvider.CompileAssemblyFromSource(compilerParameters, ExecutionWrapperCode);
        if (compilerResults.Errors.HasErrors)
        {
          StringBuilder errors = new StringBuilder();
          foreach (CompilerError error in compilerResults.Errors)
            errors.AppendLine(error.ErrorText);
          throw new Exception(errors.ToString());
        }
        Console.WriteLine(compilerResults.PathToAssembly);
        Assembly assembly = compilerResults.CompiledAssembly;
        Console.WriteLine(assembly.FullName);
        Console.WriteLine("Types:");
        foreach (Type t in assembly.GetTypes())
        {
          Console.WriteLine(t);
        }

        Type type = assembly.GetType("Validation.Execution");
        Console.WriteLine("Type:");
        Console.WriteLine(type);  //Empty when run in Docker (both mcr.microsoft.com/windows:1909 and mcr.microsoft.com/windows/servercore:ltsc2019

        var methodInfo = type.GetMethod("Execute");
        Console.WriteLine(methodInfo);
      }
    }

    private const string ExecutionWrapperCode = @"
using System;

namespace Validation
{
  public static class Execution
  {
    public static string Execute()
    {
      return ""test"";
    }
  }
}";

  }
}

我尝试了下面的docker文件(我尝试了两个windows镜像:mcr.microsoft.comwindows:1909和mcr.microsoft.comwindowsservercore:ltsc2019。

FROM mcr.microsoft.com/windows/servercore:ltsc2019
ADD /bin/Debug /
ENTRYPOINT TestContainerIssue.exe

EDIT: 我构建了两个dll,并在dotPeek中进行了比较--你可以看到Docker中的那个缺少了命名空间。 虽然它们的字节长度完全相同。

enter image description here

c# docker roslyn docker-for-windows
1个回答
0
投票

原来是这行代码。

        compilerParameters.CompilerOptions = String.Format("/lib:\"{0}\"", Path.GetDirectoryName(Uri.UnescapeDataString((new UriBuilder(Assembly.GetExecutingAssembly().CodeBase)).Path)));

导致了这个问题。我不知道为什么会导致这个问题,而且在编译器中也没有抛出错误,但也许会对别人有所帮助.Was

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