Исключение было вызвано целью вызова, когда 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[^]
Вам необходимо включить устаревшую политику активации среды выполнения в конфигурационном файле вашего приложения.