错误CS0029:无法将类型'STCADPro.Model.SCFrequency'隐式转换为'STCADPro.Model.SCFrequency'

时间:2019-10-15 19:43:30

标签: c# scripting .net-assembly roslyn

使用 CodeAnalysis 运行脚本时,出现了CS0029异常,提示我无法将一个类型转换为另一个类型,但是类型完全相同!我坚持了几天。

代码类似于:

var mscorlib = typeof(System.Object).Assembly;
var systemCore = typeof(System.Linq.Enumerable).Assembly;
var stcad = typeof(SCProjects).Assembly;
scriptOptions = ScriptOptions.Default.AddReferences(mscorlib, systemCore, stcad);
scriptOptions = scriptOptions.AddImports("System", "System.IO", "System.Threading.Tasks", "System.Linq","STCADPro.Model", "STCADPro.Physics");

var state_ = CSharpScript.RunAsync(@"", scriptOptions).Result;
state_ = state_.ContinueWithAsync("SCFrequency P3 = new SCFrequency();", scriptOptions).Result;
state_ = state_.ContinueWithAsync("SCFrequency P4 = P3; ", scriptOptions).Result;

这基本上是初始化脚本引擎,该脚本引擎先运行代码(RunAsync),然后使用ContinueWithAsync将先前的结果用作新状态。我认为这是经典架构。我将其放入一个循环,因为它必须是解释器(命令行),REPL。

我使用typeof(SCProjects)添加了装配STCAD Pro。装配,SCProjects是该装配的一类。

问题出现在最后一行:SCFrequency P4 = P3,系统无法识别P4与P3是同一类型。 有趣的是,如果我一次解析所有代码,它将起作用。因此,我的印象是,在调用之间,对程序集的某些引用丢失了,甚至可能重复了,甚至抱怨是同一程序集(和DLL文件)。

使用的版本: Microsoft CodeAnalysis: 2.4,但我也尝试过 3.4.0-beta1-final(最新版​​本)

Visual Studio 2019社区。 16.3.3。

复制步骤:

运行上面的代码。它需要STCAD模型库,很抱歉,我无法提供该库。但是我认为与库无关,但是任何其他外部库都可能有相同的问题。 脚本的最后一行(SCFrequency P3 = P4;)应无问题地执行。 但是,将引发异常,请参见下文。 在此示例中,使用的类是SCFrequency,但是我尝试在装配STCAD Pro Model中使用其他类,并且该问题也存在。

STCAD Pro模型是一个在相同解决方案中的项目!它被添加为项目参考,其DLL复制到输出文件夹。除了这个问题,一切都可以在此应用程序中正常运行。 实际上,这些代码是从同一程序集中的类执行的!

收到异常

{“(1,18):错误CS0029:无法将类型'STCADPro.Model.SCFrequency [STCADPro.Model,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]'隐式转换为'STCADPro.Model。 SCFrequency [C:\ Projects \ STCAD Pro 2018 \ trunk \ STCAD Pro GUI \ bin \ Debug \ STCADPro.Model.dll]'“}

问题更新

我能够使其工作!但是我必须使用gacutil工具在GAC中添加程序集(DLL)。

gacutil.exe -i STCADPro.Model.dll

但是对于这种解决方案,我有一些担忧:

  • 它不考虑更改,因此,如果我要更改库,则需要 将其删除并再次添加。
  • 这需要在每台客户端计算机上完成,并且需要进行更新。 这几乎是不可能完成的任务。我无法访问客户 机器或权限。

所以我不会使用此解决方案,但是至少它给出了正在发生的事情的想法,也许是所谓的DLL Hell?

我试图在程序集上签名以使用强名称。它没有太大帮助。 (但是,在我提到的gac解决方案中,我注册了一个签名的程序集。)

更新2:

一个潜在的问题:该脚本是从存在问题的同一程序集(项目)中执行的。我发现在某些情况下,如果将脚本放在另一个项目中,它将不会抱怨。这些项目属于同一解决方案(Visual Studio)。

感谢您的帮助!

0 个答案:

没有答案