Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 05.10.2018, 19:18   #1
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
Репутация: 10
По умолчанию Обратиться к методу библиотеки DLL

Здравствуйте.
Имеется библиотека DLL, построенная в MATLAB. Данная библиотека содержит один метод с двумя параметрами.
Если добавить данную библиотеку к проекту в папку Debug, то все работает отлично. Но мне необходимо, чтобы исполняемый .exe файл работал автономно (то есть можно было бы открыть на любом компьютере и использовать полностью функционал программы).
Функция MATLAB, которая рисует графики:
Код:

function [plotSrcFile, plotDstFile] = AmplitudeSpectrum(pathSrcFile, pathDstFile)
[x,fs]=wavread(pathSrcFile);
[y,fss]=wavread(pathDstFile);
 
FftS=abs(fft(x,fs));    % Амплитуды преобразования Фурье сигнала
FftSS=abs(fft(y,fss));  % Амплитуды преобразования Фурье сигнала
 
FftS=2*FftS./fs;        % Нормировка спектра по амплитуде
FftSS=2*FftSS./fss;     % Нормировка спектра по амплитуде
 
F=0:1:fs/2-1/fs;        % Массив частот вычисляемого спектра Фурье
FF=0:1:fss/2-1/fss;     % Массив частот вычисляемого спектра Фурье
 
figure(1); 
subplot(2,1,1);         % Делим окно на 2 строки и один столбец 
plotSrcFile = plot(F, FftS(1:length(F))); 
grid on;
subplot(2,1,2);         % Строим 2-ю координатную ось 
plotDstFile = plot(FF, FftSS(1:length(FF)));
grid on;
end

С помощью deploytool создал .dll файл данной функции.
Из проекта на C# вызывал следующим образом:
Код:

MATLABAmplitudeSpectrum.AmplitudeSpectrumClass obj = new MATLABAmplitudeSpectrum.AmplitudeSpectrumClass();
obj.AmplitudeSpectrum(_file1, _file2);

где _file1, _file2 означают расположение файлов на компьютере.
Но как подключить данную .dll библиотеку и как вызвать соответствующий метод в C# без добавления этой библиотеки в папку Debug приложения на C#?

Пробовал таким способом - не работает:
Код:

            byte[] rawAssembly = new byte[] { };
            
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Project.MATLABAmplitudeSpectrum.dll"))
            {
                rawAssembly = new byte[stream.Length];
                stream.Read(rawAssembly, 0, rawAssembly.Length);
            }
            
            var assembly = Assembly.Load(rawAssembly);            
            var din = assembly.CreateInstance("MATLABAmplitudeSpectrum.AmplitudeSpectrumClass");

В переменной din значение null.
Спасибо.

Последний раз редактировалось Alexey Smirnov; 05.10.2018 в 19:22.
Alexey Smirnov вне форума   Ответить с цитированием
Старый 05.10.2018, 21:19   #2
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
Репутация: 10
По умолчанию

Все время появляется следующее исключение:
Значение StartIndex не может быть меньше нуля.
Имя параметра: startIndex
Alexey Smirnov вне форума   Ответить с цитированием
Старый 05.10.2018, 21:29   #3
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
Репутация: 10
По умолчанию

System.Reflection.TargetInvocationE xception не обработано
HResult=-2146232828
Message=Адресат вызова создал исключение.
Source=mscorlib
StackTrace:
в System.RuntimeTypeHandle.CreateInst ance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
в System.RuntimeType.CreateInstanceSl ow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
в System.Activator.CreateInstance(Typ e type, Boolean nonPublic)
в System.Activator.CreateInstance(Typ e type)
в Project.MainWindow..ctor() в c:\Users\Алексей\Desktop\Project\Pr oject\Project\MainWindow.cs:строка 62
в Project.Program.Main() в c:\Users\Алексей\Desktop\Project\Pr oject\Project\Program.cs:строка 19
InnerException: System.TypeInitializationException
HResult=-2146233036
Message=Инициализатор типа "MATLABAmplitudeSpectrum.AmplitudeS pectrumClass" выдал исключение.
Source=MATLABAmplitudeSpectrum
TypeName=MATLABAmplitudeSpectrum.Am plitudeSpectrumClass
StackTrace:
в MATLABAmplitudeSpectrum.AmplitudeSp ectrumClass..ctor()
InnerException: System.ArgumentOutOfRangeException
HResult=-2146233086
Message=Значение StartIndex не может быть меньше нуля.
Имя параметра: startIndex
Source=mscorlib
ParamName=startIndex
StackTrace:
в System.String.Remove(Int32 startIndex, Int32 count)
в MATLABAmplitudeSpectrum.AmplitudeSp ectrumClass..cctor()
InnerException:
Alexey Smirnov вне форума   Ответить с цитированием
Старый 05.10.2018, 22:46   #4
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
Репутация: 10
По умолчанию

Код декомпилированного класса библиотеки:
Код:

// Decompiled with JetBrains decompiler
// Type: MATLABAmplitudeSpectrum.AmplitudeSpectrumClass
// Assembly: MATLABAmplitudeSpectrum, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 354ACAA5-46E2-4427-8B7A-1AA94B6F134F
// Assembly location: C:\Users\Алексей\Desktop\Project\Project\Project\bin\Debug\MATLABAmplitudeSpectrum.dll
 
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using System;
using System.IO;
using System.Reflection;
 
namespace MATLABAmplitudeSpectrum
{
  public class AmplitudeSpectrumClass : IDisposable
  {
    private static MWMCR mcr;
    private bool disposed;
 
    static AmplitudeSpectrumClass()
    {
      if (!MWMCR.MCRAppInitialized)
        throw new ApplicationException("MWArray assembly could not be initialized");
      Assembly executingAssembly = Assembly.GetExecutingAssembly();
      string location = executingAssembly.Location;
      int startIndex = location.LastIndexOf("\\");
      string componentPath = location.Remove(startIndex, location.Length - startIndex);
      string str = "MATLABAmplitudeSpectrum.ctf";
      Stream embeddedCtfStream = (Stream) null;
      foreach (string manifestResourceName in executingAssembly.GetManifestResourceNames())
      {
        if (manifestResourceName.Contains(str))
        {
          embeddedCtfStream = executingAssembly.GetManifestResourceStream(manifestResourceName);
          break;
        }
      }
      AmplitudeSpectrumClass.mcr = new MWMCR("", componentPath, embeddedCtfStream, true);
    }
 
    ~AmplitudeSpectrumClass()
    {
      this.Dispose(false);
    }
 
    public void Dispose()
    {
      this.Dispose(true);
      GC.SuppressFinalize((object) this);
    }
 
    protected virtual void Dispose(bool disposing)
    {
      if (this.disposed)
        return;
      this.disposed = true;
      int num = disposing ? 1 : 0;
    }
 
    public MWArray AmplitudeSpectrum()
    {
      return AmplitudeSpectrumClass.mcr.EvaluateFunction(nameof (AmplitudeSpectrum));
    }
 
    public MWArray AmplitudeSpectrum(MWArray pathSrcFile)
    {
      return AmplitudeSpectrumClass.mcr.EvaluateFunction(nameof (AmplitudeSpectrum), new MWArray[1]
      {
        pathSrcFile
      });
    }
 
    public MWArray AmplitudeSpectrum(MWArray pathSrcFile, MWArray pathDstFile)
    {
      return AmplitudeSpectrumClass.mcr.EvaluateFunction(nameof (AmplitudeSpectrum), new MWArray[2]
      {
        pathSrcFile,
        pathDstFile
      });
    }
 
    public MWArray[] AmplitudeSpectrum(int numArgsOut)
    {
      return AmplitudeSpectrumClass.mcr.EvaluateFunction(numArgsOut, nameof (AmplitudeSpectrum), new MWArray[0]);
    }
 
    public MWArray[] AmplitudeSpectrum(int numArgsOut, MWArray pathSrcFile)
    {
      return AmplitudeSpectrumClass.mcr.EvaluateFunction(numArgsOut, nameof (AmplitudeSpectrum), new MWArray[1]
      {
        pathSrcFile
      });
    }
 
    public MWArray[] AmplitudeSpectrum(int numArgsOut, MWArray pathSrcFile, MWArray pathDstFile)
    {
      return AmplitudeSpectrumClass.mcr.EvaluateFunction(numArgsOut, nameof (AmplitudeSpectrum), new MWArray[2]
      {
        pathSrcFile,
        pathDstFile
      });
    }
 
    public void AmplitudeSpectrum(int numArgsOut, ref MWArray[] argsOut, MWArray[] argsIn)
    {
      AmplitudeSpectrumClass.mcr.EvaluateFunction(nameof (AmplitudeSpectrum), numArgsOut, ref argsOut, argsIn);
    }
 
    public void WaitForFiguresToDie()
    {
      AmplitudeSpectrumClass.mcr.WaitForFiguresToDie();
    }
  }
}

Alexey Smirnov вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к методу класса по его имени? ipdd Общие вопросы Delphi 16 22.02.2016 23:58
C# Как обратиться к методу из другой формы? Таксист Windows Forms 2 24.12.2014 17:59
C# библиотеки .dll s4egol Помощь студентам 0 14.09.2014 20:34
Как обратиться к методу потомку ? [MI_nor] Общие вопросы по Java, Java SE, Kotlin 4 22.03.2011 09:13
Библиотеки Dll ivanesky Общие вопросы Delphi 9 10.03.2008 11:42


00:43.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru