Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2018, 18:18   #1
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию Обратиться к методу библиотеки 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 в 18:22.
Alexey Smirnov вне форума Ответить с цитированием
Старый 05.10.2018, 20:19   #2
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

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

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, 21:46   #4
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Код декомпилированного класса библиотеки:
Код:
// 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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