1

ここで何が間違っているのかわかりません。現在のアセンブリのコードを使用する dll を生成しています。これは、問題の原因となっているコードのみを含む簡略版です。

static void Main()
{
    Swift.Init();
}

public static class Swift
{
    public static int GetTypeId(object obj)
    {
            return 0;
    }

    public static void Init()
    {
            var getTypeIdMethod = typeof(Swift).GetMethod("GetTypeId",
                BindingFlags.Public | BindingFlags.Static);

            var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Asm"), AssemblyBuilderAccess.RunAndSave);
            var modBuilder = asmBuilder.DefineDynamicModule("Mod", "SerTest.dll");
            var typeBuilder = modBuilder.DefineType("TEST", TypeAttributes.Public);
            var methodBuilder = typeBuilder.DefineMethod("SWITCH",
                MethodAttributes.Public | MethodAttributes.Static,
                CallingConventions.Standard,
                typeof(void), new Type[] { typeof(Stream), typeof(object) });

            // arg0: Stream, arg1: object
            var il = methodBuilder.GetILGenerator();
            il.DeclareLocal(typeof(int));

            // load and store id
            il.Emit(OpCodes.Ldarg_1);                   // push object
            il.Emit(OpCodes.Call, getTypeIdMethod);     // pop object, pass to GetTypeId, push id
            il.Emit(OpCodes.Stloc_0);                   // pop, store in local
            il.Emit(OpCodes.Ret);

            typeBuilder.CreateType();
            asmBuilder.Save("SerTest.dll");
    }
}

peverify は以下を与えます:

[IL]: Error: [C:\Users\vexe\Desktop\MyExtensionsAndHelpers\Solution\CustomSerializer\bin\Release\SerTest.dll : TEST::SWITCH][offset 0x00000001] Method is not visible.
1 Error(s) Verifying SerTest.dll

このエラーはどういう意味ですか? そして、私は何を間違っていますか?

ありがとう!

編集:

ildasm で生成されたメソッドは次のようになります。

.method public static void  SWITCH(class [mscorlib]System.IO.Stream A_0,
                                   object A_1) cil managed
{
  // Code size       8 (0x8)
  .maxstack  1
  .locals init (int32 V_0)
  IL_0000:  ldarg.1
  IL_0001:  call       int32 [CustomSerializer]Serializer.Swift::GetTypeId(object)
  IL_0006:  stloc.0
  IL_0007:  ret
} // end of method TEST::SWITCH
4

1 に答える 1

2

「メソッドが表示されない」とは、参照されているメソッドが、それを呼び出しているアセンブリに表示されないことを意味します。InternalsVisibleTo(ちなみに、これは PEVerify が理解していないようです) または を使用していない場合protected internal、つまり、メソッドは可視クラスのパブリック メソッドである必要があり、可視クラスは、オプションで可視クラスにネストされたパブリック クラスです。クラス。その再帰的な定義が気に入らない場合は、publicから上にずっとです。

投稿されたコードは機能するはずです (Swiftネストされていないパブリック クラスとGetTypeIdパブリック メソッドです)。そのため、投稿されていないコードに問題があります。

于 2015-02-19T17:03:41.297 に答える