是否可以通过引用传递数据结构到动态编译的脚本?

时间:2013-07-07 20:36:57

标签: c# dynamic

这只是一个例子......我的“现实生活”例子要复杂得多。举个粗略的例子:

public struct _User
{
   public string FirstName;
   public string MiddleName;
   public string LastName;
}

我可以设置名称,然后通过引用函数传递它。

但是,我希望通过引用将数据结构传递给动态编译的代码。

    public void RunScript(string ScriptName, ref _User stUser)
    {
        private Microsoft.CSharp.CSharpCodeProvider _compiler;
        public CompilerResults _compileResults;
        private static object _compiledAssembly;

        MI.Invoke(_compiledAssembly, new object[]{
            ref stUser }); // can't do a reference here...

        MI = _compiledAssembly.GetType().GetMethod(ScriptName);

    }

是的,我在动态代码中确实拥有该结构的“副本”......

是否可以通过引用将此结构传递给动态代码?

1 个答案:

答案 0 :(得分:3)

首先,我认为您希望这两个陈述的顺序相反 - 在您调用之后设置MI 没有多大意义...

但是,你应该只能在保留引用的object[]中设置值 - 在调用之后,数组中的值将会发生变化。所以你想要:

object[] args = { stUser; }
MI.Invoke(_compiledAssembly, args);
stUser = (_User) args[0]; // Or whatever you want to do with it

(你真的需要它成为一个结构吗?还有公共领域,不能少吗?)

顺便说一下,我对这部分感到有些不安:

  

是的,我在动态代码中确实拥有该结构的“副本”......

如果你的意思是动态生成的程序集中定义了另一种类型,那就是一个问题。这两种类型是相同的,即使它们具有相同的名称空间限定名称。您应该使动态生成的程序集引用包含该类型的程序集。你真的不希望在不同的程序集中有两个具有相同名称的类型 - 这将使调试成为一个真正的痛苦......

编辑:简短而完整的例子:

using System;
using System.Reflection;

public struct MutableStruct
{
    public int x;
}

class Test
{
    public static void ChangeByRef(ref MutableStruct foo)
    {
        foo = new MutableStruct { x = 10 };
    }

    static void Main()
    {
        var args = new object[] { new MutableStruct() };
        var method = typeof(Test).GetMethod("ChangeByRef");
        method.Invoke(null, args);
        var changed = (MutableStruct) args[0];
        Console.WriteLine(changed.x); // Prints 10
    }
}