首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSharpCodeProvider与动态组件的解析

CSharpCodeProvider与动态组件的解析
EN

Stack Overflow用户
提问于 2012-11-07 15:32:06
回答 1查看 721关注 0票数 1

我有一个应用程序,在这个应用程序中,我使用CSharpCodeProvider来允许通过C#代码集成脚本。脚本可以引用动态发出的程序集(这些程序集是通过IL发射创建的);为了允许这种引用,我将动态生成的程序集保存到磁盘上的文件中,然后将这个位置添加到CompilerParameters.ReferencedAssemblies集合中。

这对于脚本的第一次编译和执行很好。我的代码实例化了从脚本生成的类,该脚本有一个接受参数的构造函数,其中有些是来自动态发出的程序集的类型。看起来是这样的:

代码语言:javascript
复制
        var hostType = _compilerResults.CompiledAssembly.GetType("ExMod.Engine.ScriptHost");

        var parameters = new List<object>();
        parameters.Add(simulation);

        var extraParameters =
            simulation.Environment.Controllers.
            Select(c => c.GetPrecompiledContext()).
            Where(c => c != null);
        parameters.AddRange(extraParameters);

        _scriptHost = (ScriptHostBase)Activator.CreateInstance(hostType, parameters.ToArray());

extraParameters表达式是添加对外部动态生成类型的引用的地方。

当我第二次编译和运行脚本时,会出现问题。只有当我重新发出新版本的IL发射程序集时,才会发生这种情况。异常发生在Activator.CreateInstance调用中,并且是:

MissingMethodException: Constructor on type 'ExMod.Engine.ScriptHost' not found.

意见:

  1. 我已经通过调试器确认了构造函数确实存在有正确的参数。
  2. 我还确认(使用Debugger中的Make对象ID )是因为构造函数中的“Controller”参数(从动态发出的程序集中引用类型)引用的是原始动态程序集,而不是最近发出的动态程序集,这就是类型不匹配和构造函数不解决的原因。
  3. 当我运行CSharpCodeProvider编译器,然后尝试运行脚本时,它永远不会调用我的AppDomain AssemblyResolve事件,这是我可以始终解析“最近”动态程序集的特殊逻辑。

我的理论是,在某种程度上,CSharpCodeProvider正在解决“最早的”动态组装,而不是“最新的”。发生这种情况是因为它们的名称和位置相同。问题:如何让CSharpCodeProvider解析到动态程序集的最新版本?

我已经考虑过更改每个动态发出的程序集的位置,但我不希望为每个脚本迭代在磁盘上创建一堆副本。

EN

回答 1

Stack Overflow用户

发布于 2012-11-07 17:02:42

我发现我可以通过让发出代码为每个构建创建一个新的版本号来解决这个问题。我只是在生成AssemblyName的代码中使用这个:

代码语言:javascript
复制
        var name = new AssemblyName();
        name.Name = "AB-PLC";
        name.Version = new Version(0, 0, Interlocked.Increment(ref _buildNumber), 0);

上面的_buildNumber是一个简单的静态int字段。

这允许CSharpCodeProvider解析正确的程序集,因为现在不同构建的FullName不再匹配。我仍然只有一个程序集的副本导出到磁盘(用每个IL发出生成覆盖)。

我仍然很想知道是否可以允许CSharpCodeProvider在不更改其FullName的情况下解析正确的程序集,但是这个解决方案目前已经足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13272877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档