Gaurav Chinchankar Ответов: 0

Исключение было вызвано целью вызова, когда COM-библиотеки DLL вызываются методом отражения в C#


Whenever my supporting COM dll's is called through reflection technique in C#, It gives me "Exception has been thrown by the target of an invocation."

My Code:

public class ExecuteAssembly { IAssembly objIAssembly = new Xml_Operations.XmlRetrive();

    public void StartExecution()
    {
        try
        {
            Type classType = LoadDll();

            // create instance of class Calculator
            //object classInstance = Activator.CreateInstance(classType);
            dynamic classInstance = (dynamic) Activator.CreateInstance(classType) <-- ERROR GETS FIRED
            classInstance.Visible = true;

            // get info about method: public
            MethodInfo methodCall = classType.GetMethod(objIAssembly.MethodName);

            ParameterInfo[] parameters = methodCall.GetParameters();

            objIAssembly.MethodOutput = methodCall.Invoke(classInstance, objIAssembly.ParametersArray);

            Xml_Operations.XmlStore.OutputToXmlFile(objIAssembly);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

    }

    private Type LoadDll()
    {
        string[] dirSplit=objIAssembly.DllPath.Split('\\');
        string dllName = dirSplit[dirSplit.Length - 1].Substring(0, dirSplit[dirSplit.Length - 1].Length - 4); ;
        int count = dirSplit[dirSplit.Length - 1].Count();
        string dirPath = objIAssembly.DllPath.Substring(0, (objIAssembly.DllPath.Length - count));

        var files = Directory.GetFiles(dirPath ,"*.dll");
        Type[] types;
        Type classType = null;
        foreach (var file in files)
        {
            try
            {
                types = Assembly.LoadFrom(file).GetTypes();

                if (types[0].AssemblyQualifiedName.Contains(dllName))
                    classType = types[0];
            }
            catch
            {
                continue;  // Can't load as .NET assembly, so ignore
            }
        }

        return classType;
    }
}


Что я уже пробовал:

Пробовал разные техники...провалился!

Karthik_Mahalingam

добавьте сюда перерыв

  classType = types[0];
  break;

Gaurav Chinchankar

Сэр, проблема не в этой части..

dynamic classInstance = (динамический) активатор.Метод createinstance(типа класса)
/*При вызове вышеуказанного метода для создания экземпляра класса..возникает ошибка*/

Karthik_Mahalingam

вы получаете ноль в
Типа класса Тип = LoadDll();

Ramza360

Вы должны добавить точку останова, чтобы убедиться, что тип класса не является нулевым в этой точке. Кроме того, если ваш тип не имеет конструктора по умолчанию, вы должны предоставить аргументы конструктора.

Gaurav Chinchankar

Сэр, я проверил, используя точку останова. Тип класса никогда не является нулевым, dll, которая не имеет C++ COM, поддерживающего dll, работает должным образом. Эта ошибка возникает только для поддержки DLL-файлов C++.

Richard Deeming

Посмотрите на внутреннее исключение, которое должно иметь больше деталей.

Gaurav Chinchankar

Сэр, я загрузил изображение внутренней ошибки исключения, пожалуйста, проверьте ссылку ниже и помогите мне исправить ошибку..
https://ibb.co/j1WVjm

Richard Deeming

Очень размытое изображение, но, насколько я могу видеть, это проблема, описанная здесь:
Запуск приложений среды выполнения .NET 2 в среде выполнения .NET 4[^]

Вам необходимо включить устаревшую политику активации среды выполнения в конфигурационном файле вашего приложения.

0 Ответов