C# 使用Roslyn创建netstandard2.0 dll在成功编译后获取运行时错误

C# 使用Roslyn创建netstandard2.0 dll在成功编译后获取运行时错误,c#,dll,roslyn,roslyn-code-analysis,C#,Dll,Roslyn,Roslyn Code Analysis,我试图使用Roslyn创建一个netstandard2.0 dll,使用找到的代码根据netstandard引用程序集进行编译。编译成功,我可以加载和调用程序集,但当我尝试在另一个项目中使用 <ItemGroup> <Reference Include="lib_test.dll" /> </ItemGroup> 我在运行时遇到以下错误: 未处理的异常。System.IO.FileNotFoundException:无法加载 文件

我试图使用Roslyn创建一个netstandard2.0 dll,使用找到的代码根据netstandard引用程序集进行编译。编译成功,我可以加载和调用程序集,但当我尝试在另一个项目中使用

<ItemGroup>
  <Reference Include="lib_test.dll" />
</ItemGroup>

我在运行时遇到以下错误:

未处理的异常。System.IO.FileNotFoundException:无法加载 文件或程序集的lib_test.dll,版本=0.0.0.0,区域性=中性, PublicKeyToken=null'。系统找不到指定的文件

文件名:“lib_test.dll,版本=0.0.0.0,区域性=中性, PublicKeyToken=null'

有什么线索或想法说明为什么会发生这种情况吗?生成程序集的代码如下所示:

enter code herestatic void Main(string[] args)

{

   string expression = "6 * 7";

   string text = @"public class Calculator

{

    public static object Evaluate()

    {

        return $;

    }

}".Replace("$", expression);

   var metadataReferences = Task.Run<IEnumerable<MetadataReference>>(async () => await Microsoft.CodeAnalysis.Testing.ReferenceAssemblies.NetStandard.NetStandard21.ResolveAsync("netstandard", default)).Result;

   SyntaxTree tree = SyntaxFactory.ParseSyntaxTree(text);

   CSharpCompilation compilation = CSharpCompilation.Create("lib_test.dll",

      options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),

      syntaxTrees: new[] { tree },

      references: metadataReferences);

 

   using (MemoryStream stream = new MemoryStream())

   {

       Microsoft.CodeAnalysis.Emit.EmitResult compileResult = compilation.Emit(stream);

       using (var fs = File.Create("lib_test.dll"))

       {

           stream.Seek(0, SeekOrigin.Begin);

           stream.CopyTo(fs);

       }

   }

}
在此处输入代码static void Main(字符串[]args)
{
字符串表达式=“6*7”;
字符串文本=@“公共类计算器
{
公共静态对象求值()
{
返回美元;
}
}“。替换(“$”,表达式);
var metadataReferences=Task.Run(async()=>wait Microsoft.codealysis.Testing.ReferenceAssemblies.NetStandard.NetStandard21.ResolveAsync(“NetStandard”,默认值)).Result;
SyntaxTree树=SyntaxFactory.ParseSyntaxTree(文本);
csharpcomilation=csharpcomilation.Create(“lib_test.dll”,
选项:新的CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
syntaxTrees:new[]{tree},
引用:元数据引用);
使用(MemoryStream stream=new MemoryStream())
{
Microsoft.CodeAnalysis.Emit.EmitResult编译器结果=compilation.Emit(流);
使用(var fs=File.Create(“lib_test.dll”))
{
stream.Seek(0,SeekOrigin.Begin);
stream.CopyTo(fs);
}
}
}

谢谢

您能解释一下为什么要这样做吗?为什么要以这种方式创建程序集?“加载并调用程序集”-您是如何做到这一点的?我需要根据用户配置其他软件的方式为用户创建程序集,这里的语法树为测试目的而简化。我使用
System.Reflection.Assembly
加载程序集并获取我调用方法的类型。您能解释一下为什么要这样做吗?为什么要以这种方式创建程序集?“加载并调用程序集”-您是如何做到这一点的?我需要根据用户配置其他软件的方式为用户创建程序集,这里的语法树为测试目的而简化。我使用
System.Reflection.Assembly
加载程序集并获取调用方法的类型。