5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
|
||||||||||||||||
1 | ||||||||||||||||
Обратиться к методу библиотеки DLL04.10.2018, 01:36. Показов 4195. Ответов 26
Метки нет (Все метки)
Здравствуйте.
Имеется библиотека DLL, построенная в MATLAB. Данная библиотека содержит один метод с двумя параметрами. Если добавить данную библиотеку к проекту в папку Debug, то все работает отлично. Но мне необходимо, чтобы исполняемый .exe файл работал автономно (то есть можно было бы открыть на любом компьютере и использовать полностью функционал программы). Такие действия сделаны:
То есть, как обратиться к методу моей библиотеки и передать в него два параметра? Спасибо.
0
|
04.10.2018, 01:36 | |
Ответы с готовыми решениями:
26
Обратиться к методу проекта через DLL Обратиться к методу Обратиться к методу находящемуся в UserControl Как обратиться к методу из другого класса |
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
|
|||||||||||
05.10.2018, 20:29 [ТС] | 21 | ||||||||||
То есть, имеется функция MATLAB, которая рисует графики:
Из проекта на C# вызывал следующим образом:
Как подключить данную .dll библиотеку и как вызвать соответствующую функцию в C# для того, чтобы приложение корректно работало при запуске одного .exe файла из любого места компьютера? Добавлено через 2 часа 27 минут Все время появляется следующее исключение: Значение StartIndex не может быть меньше нуля. Имя параметра: startIndex Добавлено через 10 минут System.Reflection.TargetInvocationException не обработано HResult=-2146232828 Message=Адресат вызова создал исключение. Source=mscorlib StackTrace: в System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) в System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) в System.Activator.CreateInstance(Type type, Boolean nonPublic) в System.Activator.CreateInstance(Type type) в Project.MainWindow..ctor() в c:\Users\Алексей\Desktop\Project\Project\Project\MainWindow.cs:строка 62 в Project.Program.Main() в c:\Users\Алексей\Desktop\Project\Project\Project\Program.cs:строка 19 InnerException: System.TypeInitializationException HResult=-2146233036 Message=Инициализатор типа "MATLABAmplitudeSpectrum.AmplitudeSpectrumClass" выдал исключение. Source=MATLABAmplitudeSpectrum TypeName=MATLABAmplitudeSpectrum.AmplitudeSpectrumClass StackTrace: в MATLABAmplitudeSpectrum.AmplitudeSpectrumClass..ctor() InnerException: System.ArgumentOutOfRangeException HResult=-2146233086 Message=Значение StartIndex не может быть меньше нуля. Имя параметра: startIndex Source=mscorlib ParamName=startIndex StackTrace: в System.String.Remove(Int32 startIndex, Int32 count) в MATLABAmplitudeSpectrum.AmplitudeSpectrumClass..cctor() InnerException:
0
|
Администратор
|
|
05.10.2018, 21:15 | 22 |
Код класса AmplitudeSpectrumClass генерирует сам Matlab? Посмотри декомпилятором код его конструктора чтобы можно было хотя предположить что является причиной исключения.
0
|
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
|
||||||
05.10.2018, 21:25 [ТС] | 23 | |||||
OwenGlendower, если я все правильно сделал, то такой код:
0
|
Администратор
|
|
05.10.2018, 21:50 | 24 |
Alex7676, в коде конструктора видно что он получает путь к текущей сборке (к самой себе) и оставляет только каталог в componentPath. У динамически загруженной сборки Location = "", LastIndexOf("\") возвращает -1, которая передается в Remove и мы получаем исключение.
Т.к. этот код генерируется Matlab-ом, то можно попытаться пропатчить/изменить IL код так чтобы componentPath присваивался каталог приложения. Или - что будет проще - сделать самораспаковывающийся exe который создаст в своей папке или папке temp временный каталог, распакует туда основной exe и библиотеки, запустит exe и будет ждать его завершения и в конце удалит эту временную папку.
0
|
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
|
|
05.10.2018, 21:56 [ТС] | 25 |
OwenGlendower, то есть других, более простых вариантов, решений данной проблемы нет?
0
|
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
|
|
05.10.2018, 22:12 [ТС] | 27 |
OwenGlendower, почему тогда код, приведенный Nord790, работает, если просто добавить библиотеку к проекту? Ведь данные библиотеки я также добавляю к проекту.
0
|
05.10.2018, 22:12 | |
05.10.2018, 22:12 | |
Помогаю со студенческими работами здесь
27
Обратиться к другому классу и методу несколько раз Как обратиться к методу из другого метода внутри одного и того же класса Создание dll библиотеки в C#. Вызов классов этой библиотеки Как использовать методы библиотеки DLL, и игнорировать их, когда DLL нету? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |