Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование C++ dll в C#

26K
26 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Есть dll, написанная на C++. Имеются исходные коды.
Как использовать её в C#? Читал про разные способы, но из-за отсутствия необходимых знаний (пишу преимущественно под PHP), плохо понял что делать в моем случае.

Заранее спасибо.
63K
26 февраля 2011 года
50bites
24 / / 12.12.2010
товарищ курите в сторону маршалинга и использование неуправляемого кода, вот http://msdn.microsoft.com/ru-ru/library/26thfadc%28v=VS.90%29.aspx
26K
26 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Курил уже, но все равно не получается, поэтому и обратился.
Проблема даже в другом, не получается у меня перевести программу с Delphi на C#.
C Delphi вобще не знаком, может кто сможет помочь.
Вот пример фрагмента использования dll:

Цитата:
type
CImportingDLL = class
public
function InitMasterWnd(hWnd: HWND):bool; virtual; stdcall; abstract;
procedure GetScreenshot(); virtual; stdcall; abstract;
end;

ConfigData = class
public
procedure SetConfig(GraphicModeFlag: integer; Directory: string; ShowIndicatorFlag: boolean); virtual; stdcall; abstract;
end;

var
sg_Dll: CImportingDLL;
sg_Config: ConfigData;

function Ret_pCImportingDLL(): CImportingDLL; stdcall; external 'ImportingDll.dll';
function Ret_pConfigData(): ConfigData; stdcall; external 'ImportingDll.dll';

procedure TForm1.Button2Click(Sender: TObject);
begin
sg_Dll := Ret_pCImportingDLL();
sg_Config := Ret_pConfigData();

sg_Dll.InitMasterWnd(Application.Handle);
sg_Config.SetConfig(1, Edit1.Text, true);
end;



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

26K
26 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Пробую сделать что-то по анологии:
Цитата:
public abstract class CImportingDLL
{
static public void InitMasterWnd(IntPtr hWnd);
static public int GetScreenshot();
}

public abstract class ConfigData
{
static public void SetConfig(int GraphicModeFlag, string Directory, bool ShowIndicatorFlag);
}

[DllImportAttribute("ImportingDll.dll", CharSet = CharSet.Auto)]
private static CImportingDLL Ret_pCImportingDLL();

[DllImportAttribute("ImportingDll.dll", CharSet = CharSet.Auto)]
private static ConfigData Ret_pConfigData();



Visual Studio ругает на строчки после DllImportAttribute:
Ошибка 2 Требуется класс, делегат, перечисление, интерфейс или структура

5
26 февраля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 3D-GRAF
Пробую сделать что-то по анологии

Может вам стоит сперва C# изучить, раз такие проблемы с базовым синтаксисом (методы можно только в декларациях типов объявлять)?

А по теме, пока вы не приведете примеров сигнатур нативных функций, никто не станет отвечать конкретно.
И, кстати, классы из нативного кода импортировать в C# нельзя - только функции, для более тесного взаимодействия нужно пользоваться MC++.

26K
26 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Цитата: hardcase
Может вам стоит сперва C# изучить, раз такие проблемы с базовым синтаксисом (методы можно только в декларациях типов объявлять)?


Конечно, стОит. Но увы время для этой задачи ограниченно.

Цитата: hardcase
А по теме, пока вы не приведете примеров сигнатур нативных функций, никто не станет отвечать конкретно.
И, кстати, классы из нативного кода импортировать в C# нельзя - только функции, для более тесного взаимодействия нужно пользоваться MC++.



Я выше привел рабочий пример взаимодействия с dll на Delphi. Неужели там это возможно, а в C# нет?
В том же примере и все функции имеются.

5
26 февраля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 3D-GRAF
Я выше привел рабочий пример взаимодействия с dll на Delphi. Неужели там это возможно, а в C# нет?


Нет. Использовать из C# классы из нативного кода можно только через COM.
А вообще продемонстрированный код работает лишь при условии, что dll скомпилирована либо Delphi, либо С++Builder-ом. И используется из этих сред, так как для остального мира остается загадкой бинарный ООП-интерфейс.

26K
26 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Сама DLL скомпилирована в Visual Studio C++, и из программы на Delphi она точно работает.
26K
26 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Может все-таки как-то возможно?
Раз уж из Delphi вызывается и dll скомпилировано не Delphi и не C++Builder'ом.

Вот такой пример компилируется, но выдает ошибку при запуске:
Не удается загрузить DLL "C:\Tmp\TaksiDLL.dll": Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL). (Исключение из HRESULT: 0x8007045A)

Код:
namespace TestApp
{
   public partial class LoginForm : Form
   {
       public abstract class CImportingDll
       {
           public abstract void InitMasterWnd(IntPtr hWnd);
           public abstract int GetScreenshot();
       }

       public abstract class CImportingConfigData
       {
           public abstract void AutoSetConfig(int GraphicModeFlag, string CaptureDir, bool ShowIndicatorFlag);
       }

       [DllImportAttribute("C:\\Tmp\\ImportingDLL.dll", CharSet = CharSet.Auto)]
       static extern CImportingDll Ret_pCImportingDll();

       [DllImportAttribute("C:\\Tmp\\ImportingDLL.dll", CharSet = CharSet.Auto)]
       static extern CImportingConfigData Ret_pCImportingConfigData();

       public LoginForm()
       {
           InitializeComponent();

           CImportingDll sg_Dll = Ret_pCImportingDll();
           CImportingConfigData sg_Config = Ret_pCImportingConfigData();

           sg_Dll.InitMasterWnd(this.Handle);
           sg_Config.AutoSetConfig(1, "C:\\Tmp\\", true);
       }
}
5
26 февраля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 3D-GRAF
Может все-таки как-то возможно?

Возможно через написание прослойки на MC++.

26K
27 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
А где можно про это почитать?
Или же для этого придется всю dll переделывать?
5
27 февраля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: 3D-GRAF
А где можно про это почитать?
Или же для этого придется всю dll переделывать?


PInvoke позволяет вызывать простые экспортируемые функции, он не позволяет вызвать методы классов.
Чтобы использовать такие классы нативного кода из .NET необходимо написать обертку для них на MC++, т.е. создать смешаную сборку (содержащую машинный код и IL код). Для этого необходимо точно также экспортировать классы из dll в C++ (статически слиновать) и написать к ним обертку - каждый такой класс обернуть в ref class.
Другой путь - сделать интерфейс работы с dll в C-style, используя хэндлы и/или передавая обычные структуры, в этом случае промежуточный код на MC++ не потребуется.

26K
27 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Не получается импортировать функции даже без классов:

Код:
namespace TestApp
{
    public partial class LoginForm : Form
    {
        [DllImportAttribute("C:\\Tmp\\ImportingDLL.dll")]
        static extern bool ExportInitMasterWnd(IntPtr HWND);

        [DllImportAttribute("C:\\Tmp\\ImportingDLL.dll")]
        static extern void ExportAutoSetConfig(int GraphicModeFlag, string CaptureDir, bool ShowIndicatorFlag);

        [DllImportAttribute("C:\\Tmp\\ImportingDLL.dll")]
        static extern void GetScreenshot();

        public LoginForm()
        {
            InitializeComponent();

            ExportInitMasterWnd(this.Handle);
            ExportAutoSetConfig(1, "C:\\Tmp\\", true);
            GetScreenshot();
        }
}


Выдает всё тоже:
Не удается загрузить DLL "C:\Tmp\ImportingDLL.dll": Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL).
5
27 февраля 2011 года
hardcase
4.5K / / 09.08.2005
В какой момент выдает?
Дело в том, что свойство Handle в конструкторе может быть не опеределено...
26K
27 февраля 2011 года
3D-GRAF
41 / / 28.06.2008
Выдает при вызове импортируемых функций, т.е. начиная с ExportInitMasterWnd(this.Handle);
Если даже строчку с Handle закомментировать, остальные дву выдают такую же ошибку.

Вот я и не пойму, дело в реализации на C#, либо в самой dll.
26K
02 марта 2011 года
3D-GRAF
41 / / 28.06.2008
Проблема решена, была некорректная dll.
65K
01 июля 2011 года
FiloXSee
18 / / 01.07.2011
Есть еще вариант использования С++ кода в C#, который я описывал в данной статье:
http://itw66.ru/blog/c_sharp/499.html
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог