peverify:方法不可见?
peverify: Method is not visible?
我不确定自己做错了什么。我正在生成一个使用当前程序集中的代码的 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
"Method is not visible" 表示引用的方法对调用它的程序集不可见。如果您没有使用 InternalsVisibleTo
(which PEVerify doesn't appear to understand, by the way) or protected internal
,这意味着:该方法必须是可见 class 的 public 方法,并且可见 class 是 public class 可选择嵌套在可见的 class 中。如果你不喜欢那个递归定义:它是 public
一路 down up.
发布的代码应该可以工作(Swift
是一个非嵌套的 public class 和 GetTypeId
一个 public 方法),所以问题在代码中未发布。
我不确定自己做错了什么。我正在生成一个使用当前程序集中的代码的 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
"Method is not visible" 表示引用的方法对调用它的程序集不可见。如果您没有使用 InternalsVisibleTo
(which PEVerify doesn't appear to understand, by the way) or protected internal
,这意味着:该方法必须是可见 class 的 public 方法,并且可见 class 是 public class 可选择嵌套在可见的 class 中。如果你不喜欢那个递归定义:它是 public
一路 down up.
发布的代码应该可以工作(Swift
是一个非嵌套的 public class 和 GetTypeId
一个 public 方法),所以问题在代码中未发布。