我在我的应用程序中使用mono作为嵌入式脚本环境。为了编译脚本,我使用Microsoft.CSharp.CSharpCodeProvider。现在我需要一些像System.Numerics这样的4.0或4.5功能。但是,在编译器选项中引用System.Numerics.dll只会出现错误
(0,0):错误CS0006:找不到元数据文件`System.Numerics.dll'
由于提供程序的程序集位置指向2.0.0.0 gac,因此看到此失败并不会太惊讶。但是,使用mono-2.11.4以及v4.0和v4.5配置文件时,我想知道为什么提供程序找不到所需的程序集,或者它是否按要求提供v4.0。
var provider_options = new Dictionary<string,string>();
provider_options.Add("CompilerVersion", "v4.0");
CodeDomProvider provider = new CSharpCodeProvider(provider_options);
CompilerParameters cparams = new CompilerParameters ();
cparams.GenerateExecutable = true;
cparams.OutputAssembly = Path.ChangeExtension(rFileNames[0],".exe");
cparams.ReferencedAssemblies.Add( "System.dll" );
cparams.ReferencedAssemblies.Add( "System.Windows.Forms.dll" );
cparams.ReferencedAssemblies.Add( "System.Drawing.dll" );
cparams.ReferencedAssemblies.Add( "Mono.Debugger.Soft.dll" );
cparams.ReferencedAssemblies.Add( "System.Numerics.dll" );
答案 0 :(得分:0)
在Jon的评论之后,我在考虑执行框架。虽然页面embedding mono表明mono_jit_init (domain_name);
“...将返回一个将执行代码的MonoDomain.domain_name是主应用程序域的名称。此调用将初始化默认框架版本,可能是2.0或4.0,具体取决于使用的Mono版本。“
它没有为单声道2.11.4返回.net 4.0域名,虽然我很想相信这一点。
通过调用mono_jit_init_version ("myapp", ""v4.0);
来强制执行该版本。