引用Newtonsoft.Json.dll时,在单声道下在运行时编译C#代码失败

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

我们的软件是在运行C#.Net-Framework 4.7.2中编写的。我们的用户可以使用我们软件内置的脚本编辑器来使用C#编写自己的用户脚本。为了实现这一点,我们使用.Net组件CodeDomProvider。为了使以简单的方式使用JSON成为可能,我们希望在用户的脚本中引用Newtonsoft.Json.dll。这是通过将引用添加到CodeDomProvider的CompilerParameters来完成的。通过使用最新的Newtonsoft.Json NuGet软件包(12.0.3),将Newtonsoft.Json添加到我的应用程序中。

这里是此设置的最小示例:

using System;
using System.CodeDom.Compiler;
using System.IO;

namespace ScriptingUnix
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string output;
                if (Environment.OSVersion.Platform == PlatformID.Unix)
                {
                    output = "/tmp/MyUnixTest.dll";
                }
                else
                {
                    output = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyUnixTest.dll");
                }

                CompilerParameters parameters = new CompilerParameters
                {
                    GenerateInMemory = false,
                    IncludeDebugInformation = true,
                    OutputAssembly = output
                };

                using (CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp"))
                {
                    parameters.ReferencedAssemblies.Add("System.dll");
                    parameters.ReferencedAssemblies.Add("Newtonsoft.Json.dll");
                    CompilerResults results = codeProvider.CompileAssemblyFromSource
                    (
                        parameters, 
                        "using System;\nusing Newtonsoft.Json.Serialization;\nusing Newtonsoft.Json.Linq;\n class Program\r\n{\r\n    static void Main(string[] args)\r\n    {\r\n        \r\n    }\r\n}"
                    );

                    foreach (CompilerError compilerError in results.Errors)
                    {
                        Console.WriteLine(compilerError);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadLine();
        }
    }
}

此设置在Windows的.Net Framework下运行良好。问题是,我们还提供了在(Arch)-Linux上运行Mono的软件版本(Linux 4.19.80-1-ARCH armv7l,Mono JIT编译器版本6.0.0(makepkg / 6256b82d62f Wed 25 Sep 2019 05 :UTC的04:08 :),在单声道上运行相同的代码将导致error CS0006: Metadata file Newtonsoft.Json.dll could not be found

我已经尝试将以下内容添加到应用程序的app.conf中,但这没有帮助。同样,重新安装NuGet软件包也无济于事。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

有人对如何使它正常工作有任何提示吗?

c# json.net mono
1个回答
0
投票

您的代码示例在.NET 4.7上运行良好,但是由于您正在运行Mono,因此这里有一些可能的解决方案:

编译器需要知道从何处获取此文件。如果您说需要引用System.dll-编译器可能会尝试在GAC中找到它(并且确实找到了它)。当您引用Newtonsoft.Json.dll之类的未知库时,它将尝试搜索GAC并失败。然后可能正在尝试在工作目录etc ..]中找到它

解决方案1:

尝试设置库的完整路径;

解决方案2:

尝试在GAC中register Newtonsoft.Json.dll

解决方案3:

尝试.NET Core!令人惊奇的是,跨平台的3.1版现在具有开源WinForms和WPF!

我知道将代码移至.NET Core 3会花费一些时间,但仍然值得您花时间。

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