Я создал DLL с кодом отражения в нем.Когда я использую эту DLL, приложение, которое вызывает функцию, содержащую отражения, вызывает сбой программы, и я получаю нулевую ссылку в разобранном виде в Visual Studio.Однако при комментировании только вызовов отражений программа работает нормально.
Снимок в разобранном виде, который мне представляется Нажмите здесь, чтобы просмотреть
Снимок в разобранном видепросмотр и трассировка стека трассировка стека
Ниже функций, которые я пытаюсь запустить.
internal static CreateInstance CreateInstanceByType(Type type)
{
//check constructor
ConstructorInfo ctor = null;
ConstructorInfo[] ctors =
type.GetConstructors(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
for (int i = 0; i < ctors.Length; i++)
{
if (ctors[i].GetParameters().Length == 0)
{
ctor = ctors[i];
break;
}
}
if (ctor == null)
{
MethodInfo method = typeof(CSMInstanceFactory).GetMethod("CreateInstance");
method = method.MakeGenericMethod(type);
return method.CreateDelegate(typeof(CreateInstance)) as CreateInstance;
}
return CilCreateInstanceByType(type, ctor);
}
private static CreateInstance CilCreateInstanceByType(Type type, ConstructorInfo ctor)
{
string constructor = type.Name + ".Ctor";
Type[] parametertypes = new Type[0];
DynamicMethod method = new DynamicMethod(constructor, type, parametertypes, typeof(Activator));
ILGenerator generator = method.GetILGenerator(2);
generator.Emit(OpCodes.Newobj, ctor);
generator.Emit(OpCodes.Ret);
return method.CreateDelegate(typeof(CreateInstance)) as CreateInstance;
}
public static object CreateInstanceArrayByType(Type type, int amount)
{
MethodInfo method = typeof(CSMInstanceFactory).GetMethod("CreateInstanceArray");
MethodInfo genericMethod = method.MakeGenericMethod(type);
return genericMethod.Invoke(null, new object[] { amount });
}
И ниже кода, который я закомментировал, что привело к его работе.
internal static CreateInstance CreateInstanceByType(Type type)
{
//check constructor
ConstructorInfo ctor = null;
//ConstructorInfo[] ctors =
// type.GetConstructors(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
//for (int i = 0; i < ctors.Length; i++)
//{
// if (ctors[i].GetParameters().Length == 0)
// {
// ctor = ctors[i];
// break;
// }
//}
if (ctor == null)
{
//MethodInfo method = typeof(CSMInstanceFactory).GetMethod("CreateInstance");
//method = method.MakeGenericMethod(type);
//return method.CreateDelegate(typeof(CreateInstance)) as CreateInstance;
}
//return CilCreateInstanceByType(type, ctor);
return null;
}