Сбой приложения C # при вызове отражения в связанной DLL - PullRequest
0 голосов
/ 08 июня 2018

Я создал 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;
    }
...