我们的软件是用
此设置在Windows的.Net Framework下运行良好。问题是,我们还提供了在(Arch)-Linux(Linux 4.19.80-1-ARCH armv7l,Mono JIT编译器版本6.0.0(makepkg/6256b82d62f于2019年9月25日星期三上午05:04:08 UTC))上运行Mono版本的软件,在此版本下使用mono运行相同的代码会导致错误CS0006:找不到元数据文件Newtonsoft.Json.dll。
我已经尝试将以下内容添加到应用程序的app.conf中,但没有帮助。重新安装NuGet包也没有帮助。将Newtonsoft.Json.dll添加到GAC不起作用(失败并显示“将程序集Newtonsoft.Json.dll添加到缓存时出错:指定的文件不是有效的程序集。”)。在尝试app.conf时,我观察到错误消息更改为“错误CS0009:元数据文件/opt/Newtonsoft.Json.dll不包含有效的元数据:元数据文件/opt/Newtonsoft.Json.dll不包含有效的元数据”。这就是我猜他找到了dll但需要额外的有效元数据。我想到了某种类型的dll.conf。
C#
编写的,运行在.Net-Framework 4.7.2
上。我们的用户可以使用内置的脚本编辑器编写自己的C#用户脚本。为了实现这一点,我们使用了CodeDomProvider
.Net组件。为了方便地处理JSON,我们希望在我们的用户脚本中引用 Newtonsoft.Json.dll
。这可以通过将其添加到CodeDomProvider的CompilerParameters来实现。最新版本的Newtonsoft.Json NuGet
包(12.0.3)已被添加到我的应用程序中。以下是这种设置的最简示例: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(Linux 4.19.80-1-ARCH armv7l,Mono JIT编译器版本6.0.0(makepkg/6256b82d62f于2019年9月25日星期三上午05:04:08 UTC))上运行Mono版本的软件,在此版本下使用mono运行相同的代码会导致错误CS0006:找不到元数据文件Newtonsoft.Json.dll。
我已经尝试将以下内容添加到应用程序的app.conf中,但没有帮助。重新安装NuGet包也没有帮助。将Newtonsoft.Json.dll添加到GAC不起作用(失败并显示“将程序集Newtonsoft.Json.dll添加到缓存时出错:指定的文件不是有效的程序集。”)。在尝试app.conf时,我观察到错误消息更改为“错误CS0009:元数据文件/opt/Newtonsoft.Json.dll不包含有效的元数据:元数据文件/opt/Newtonsoft.Json.dll不包含有效的元数据”。这就是我猜他找到了dll但需要额外的有效元数据。我想到了某种类型的dll.conf。
<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>
有没有人对如何使这个工作有提示?
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="11.0.0.0" />
。现在它按预期工作了。非常感谢@Andrus。 - Soloresq