1

これは単なる例です...私の「実生活」の例はもっと複雑です。この大まかな例を見てください:

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);

    }

はい、動的コードにその構造の「コピー」があります...

この構造を参照によって動的コードに渡すことは可能ですか?

4

1 に答える 1

3

まず、2 つのステートメントを逆の順序で使用する必要があると思います。呼び出したMI に設定しても意味がありません...

ただし、参照を保持する に値を設定するだけでよいはずですobject[]。呼び出し後、配列の値は変更されます。あなたが望んでいるのは:

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

(本当に構造体である必要がありますか? パブリック フィールドの場合も同様です?)

ちなみに、私はこの部分に少し動揺しています:

はい、動的コードにその構造の「コピー」があります...

動的に生成されたアセンブリに別の型が定義されているとしたら、それは問題です。名前空間で修飾された名前が同じであっても、2 つの型は同じではありません。動的に生成されたアセンブリが、型を含むアセンブリを参照するようにする必要があります。異なるアセンブリで同じ名前の 2 つの型が必要になることは本当にありません。デバッグが本当に面倒になります...

編集:短いが完全な例:

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
    }
}
于 2013-07-07T20:41:30.283 に答える