0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14

Создать управляемую библиотеку, чтобы использовать ее в будущем в других .NET проектах

18.07.2014, 17:49. Показов 2128. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется заголовочный h.-файл с C++ кодом, реализующий решение систем нелинейных уравнений

В нем есть объявление функций и их реализация:

Объявление:
C++
1
2
3
4
template <typename Func>
void fdjac1 ( Func fcn,
  int n, double x[], double fvec[], double fjac[], int ldfjac, int *iflag,
  int ml, int mu, double epsfcn, double wa1[], double wa2[] );
Реализация:
C++
1
2
3
4
5
6
7
8
void fdjac1 ( void fcn ( int n, double x[], double f[], int *iflag ),
  int n, double x[], double fvec[], double fjac[], int ldfjac, int *iflag,
  int ml, int mu, double epsfcn, double wa1[], double wa2[] )
 
{
  //всякая всячина
  
}
Я задался целью, сделать управляемую библиотеку, чтобы использовать ее в будущем в моих .Net проектах.
Возник вопрос как правильно сделать аналогично объявление и реализацию в managed dll конструкции выше.
Не понятно, как обращаться с generic типом
C++
1
template <typename Func>
, где Func у меня везде будет
C++
1
void fcn ( int n, double x[], double f[], int *iflag )
Выложил архив с проектом в папке ManagedAssemblies и изначальный заголовочный файл lib.txt
Вложения
Тип файла: rar ManagedAssemblies.rar (649.0 Кб, 25 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2014, 17:49
Ответы с готовыми решениями:

Как создать UserControl и использовать его в качестве шаблона в других проектах
привет, можно какойнить пример того что мне нужно? например есть составной элемент из стандартных элементов. вопрос можноли сделать...

Как создать dll-библиотеку, чтобы другие могли ее использовать?
Здраствуйте. Допустим, у меня есть код програмы. Как создать dll библиотеку со всеми функциями и процедурами етой програмы, так, чтобы...

Как правильно использовать свой обновляемый проект в других своих проектах
Имеется десяток рабочих проектов, к которым подключаю с помощью reference проект-библиотеку (скопировав его в папку рабочего проекта) и...

15
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
19.07.2014, 03:12
Цитата Сообщение от anakinskyoker Посмотреть сообщение
Я задался целью, сделать управляемую библиотеку, чтобы использовать ее в будущем в моих .Net проектах.
Ну так перепишите на VB.NET
1
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
19.07.2014, 04:08  [ТС]
Цитата Сообщение от MrCold Посмотреть сообщение
Сообщение от anakinskyoker
Я задался целью, сделать управляемую библиотеку, чтобы использовать ее в будущем в моих .Net проектах.
Ну так перепишите на VB.NET
Спасибо, но это не вариант. Уже пробовал это делать, и на Vb.net и на C#. Не вышло.
А можно как-нибудь заменить шаблон функции template на указатель? Как-то через typedef реализовать?
0
Универсальный программист
 Аватар для zhvan
41 / 33 / 9
Регистрация: 21.12.2013
Сообщений: 374
Записей в блоге: 1
19.07.2014, 04:12
Цитата Сообщение от anakinskyoker Посмотреть сообщение
А можно как-нибудь заменить шаблон функции template на указатель?
разве что объявить глобальной
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
19.07.2014, 05:02
Цитата Сообщение от anakinskyoker Посмотреть сообщение
А можно как-нибудь заменить шаблон функции template на указатель? Как-то через typedef реализовать?

Что бы избавиться от template, объявите указатель на функцию

C++
1
typedef  void (*Func) ( int n, double x[], double f[], int *iflag );
Добавлено через 1 минуту
C++
1
2
extern "C++" __declspec(dllexport) int hybrd1 ( Func fcn, int n,
    double x[], double fvec[], double tol, double wa[], int lwa );
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
   '   void (*Func) ( int n, double x[], double f[], int *iflag );  
 
    <UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
    Public Delegate Sub DelegFunc(ByVal n As Integer, ByVal x As Double(), ByVal f As Double(), ByRef iflag As Integer)
 
    <DllImport("MathDLL.dll", CallingConvention:=CallingConvention.Cdecl, EntryPoint:="?hybrd1@@YAHP6AXHQAN0PAH@ZH00N0H@Z")> _
    Public Shared Function hybrd1(<MarshalAs(UnmanagedType.FunctionPtr)> ByVal fcn As DelegFunc, ByVal n As Integer, _
     ByVal x As Double(), ByVal fvec As Double(), ByVal tol As Double, ByVal wa As Double(), ByVal lwa As Integer) As Integer
    End Function
 
    Private DFunc As DelegFunc = Nothing
 
 
    Public Sub Func(ByVal n As Integer, ByVal x As Double(), ByVal f As Double(), ByRef iflag As Integer)
        '////////////////
        '//////////////////
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 
        Dim n% = 3
        Dim x#() = {1.3, 2.3, 3.3}
        Dim fvec#() = {1.3, 2.3, 3.3}
        Dim wa#() = {1.8, 2, 3}
        Dim tol# = 4.8
        Dim lwa% = 4
        Me.DFunc = New DelegFunc(AddressOf Func)
        Dim val As Integer = hybrd1(DFunc, n, x, fvec, tol, wa, lwa)
        TextBox1.Text = CStr(val)
 
    End Sub
Добавлено через 1 минуту
т.е. это вариант использования нативной длл

Добавлено через 45 минут
собираете обычную длл. все функции и указатель на функцию объявляете в хэдере,
реализацию функций в СРР файле.
ref class уберите совсем
Цитата Сообщение от anakinskyoker Посмотреть сообщение
Уже пробовал это делать, и на Vb.net и на C#
Так вам именно управляемую сборку?
Завтра захотите в других проектах, без NET и опять переписывать?
1
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
19.07.2014, 08:38  [ТС]
Цитата Сообщение от MrCold Посмотреть сообщение
Так вам именно управляемую сборку?
Завтра захотите в других проектах, без NET и опять переписывать?
Спасибо за ответ, да именно управляемую библиотеку. Для других проектов, могу пользоваться библиотекой в заголовочнике из которого собственно собираю managed dll.

Добавлено через 2 часа 21 минуту
Цитата Сообщение от MrCold Посмотреть сообщение
собираете обычную длл. все функции и указатель на функцию объявляете в хэдере,
реализацию функций в СРР файле.
ref class уберите совсем
Только, что прочел что шаблоны и указатели C++/CLI при подключении к проектам .NET съедаются метаданные из-за несовместимости этих типов. Придется делать именно как посоветовали вы нативную длл-ку и пушить в нее данные из C#. опыта такого у меня нет совсем, поэтому если возникнут вопросы я еще немножечко у вас спрошу, можно?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
21.07.2014, 15:32
Вообще, C# поддерживает шаблоны.
http://msdn.microsoft.com/en-u... ad0zb.aspx
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
21.07.2014, 19:45
CheshireCat, там ни к чему генерики. Если на С# переписывать, то там один тип делегата на всю
библиотеку.
0
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
31.07.2014, 09:00  [ТС]
Цитата Сообщение от MrCold Посмотреть сообщение
собираете обычную длл. все функции и указатель на функцию объявляете в хэдере,
реализацию функций в СРР файле.
ref class уберите совсем
Доброго времени суток, я собрал unmanaged dll по вашим рекомендациям и проверил ее работоспособность, подключив к консольному приложению на чистом C++.
А вот, вызывать функции из dll из проекта на VB.Net все еще не получается. Кажется, функция считывается и пытается выполнятся но возникает ошибка как-то связанная с границами массивов, наверное есть какое-то несоответствие массивов си и бейсика. Пожалуйста, будьте добры взгляните на проекты: Dynamic Lybrary (2 решения: MathFuncsDll - дллка, MyExecRefsDll - вызов функции дллки на С++) и testdll in vb (вызов функции дллки на Vb.net)
Вложения
Тип файла: rar DynamicLibrary.rar (17.8 Кб, 23 просмотров)
Тип файла: rar testdll in vb.rar (89.6 Кб, 25 просмотров)
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
31.07.2014, 10:56
функции неверно принимают массивы. вот тут все написано (MSDN HOWTO: Pass Arrays Between Visual Basic and C Q207931) http://support.microsoft.com/kb/207931
1
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
31.07.2014, 13:59  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
функции неверно принимают массивы. вот тут все написано (MSDN HOWTO: Pass Arrays Between Visual Basic and C Q207931) http://support.microsoft.com/kb/207931
Спасибо, похоже Вы правы, насколько я понял из статьи массивы в .NET другого типа (safearray) нежели в С++, и для организации взаимодействия нужно, как-то научить воспринимать этот тип safearray неуправляемым кодом, либо конвертировать в управляемом коде тип safearray в Сишный указатель.
Для первого случая, кажется годится 1 или 2 метод (не уверен какой выгодней) в указанной Вами статье, для второго случая наверное можно использовать средства класса Marshal(по-моему это гораздо проще, но что-то не нашел хорошего понятного для новичка примера).
Буду пробовать оба подхода, ну и надеюсь на ваши советы и предложения.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
31.07.2014, 15:25
1 метод, как я понял, это и есть передача указателя в C-стиле
2 метод, это когда мы принимаем настоящий safearray
наверное, 1 метод лучше ибо зачем нам мучиться?
1
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
31.07.2014, 15:41
Прошелся отладчиком , все массивы возвращаются из длл длинной равной единице.
Жестко размер укажите в параметрах, должно помочь.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   <UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
    Public Delegate Sub DelegFunc(ByVal n As Integer,
                                  <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                                  ByVal x As Double(),
                                  <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                                  ByVal f As Double(),
                                  ByRef iflag As Integer)
 
    <DllImport("MathFuncsDll.dll", EntryPoint:="hybrd1", CallingConvention:=CallingConvention.Cdecl)> _
    Public Function addhybrd1(<MarshalAs(UnmanagedType.FunctionPtr)> ByVal fcn As DelegFunc,
                              ByVal n As Integer,
                               <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                              ByVal x As Double(),
                              <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                              ByVal fvec As Double(),
                              ByVal tol As Double,
                               <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                              ByVal wa As Double(),
                              ByVal lwa As Integer) As Integer
    End Function
1
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
31.07.2014, 19:05  [ТС]
Цитата Сообщение от MrCold Посмотреть сообщение
Прошелся отладчиком , все массивы возвращаются из длл длинной равной единице.
Жестко размер укажите в параметрах, должно помочь.
Ошибка исчезла, но почему-то в массиве с решением xSys1(0..3) одни нули.

Добавлено через 13 минут
Цитата Сообщение от anakinskyoker Посмотреть сообщение
Сообщение от MrCold
Прошелся отладчиком , все массивы возвращаются из длл длинной равной единице.
Жестко размер укажите в параметрах, должно помочь.
Ошибка исчезла, но почему-то в массиве с решением xSys1(0..3) одни нули.
Хотя, вру ошибка не исчезла :
A first chance exception of type 'System.IndexOutOfRangeException' occurred in testdll in vb.exe
A first chance exception of type 'System.AccessViolationException' occurred in testdll in vb.exe
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
31.07.2014, 20:56
а где выкидывает?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
01.08.2014, 12:59
Лучший ответ Сообщение было отмечено anakinskyoker как решение

Решение

Не по теме:

утром на свежую голову вспомнил про In, Out

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <UnmanagedFunctionPointer(CallingConvention.Cdecl)> _
    Public Delegate Sub DelegFunc1(ByVal n As Integer,
                                  <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                                 <[In](), Out()> ByVal x() As Double,
                                  <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                                 <[In](), Out()> ByVal f() As Double,
                                  ByRef iflag As Integer)
 
    <DllImport("MathFuncsDll.dll", EntryPoint:="hybrd1", CallingConvention:=CallingConvention.Cdecl)> _
    Public Function addhybrd1(<MarshalAs(UnmanagedType.FunctionPtr)> ByVal fcn As DelegFunc1,
                              ByVal n As Integer,
                               <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                             <[In](), Out()> ByVal x() As Double,
                              <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                             <[In](), Out()> ByVal fvec() As Double,
                              ByVal tol As Double,
                               <MarshalAs(UnmanagedType.LPArray, SizeConst:=100)>
                             <[In](), Out()> ByVal wa() As Double,
                              ByVal lwa As Integer) As Integer
    End Function
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2014, 12:59
Помогаю со студенческими работами здесь

Как использовать библиотеку JSON .NET
Помогите кто нибудь, караул кричать готов. Прилагающуюся документацию просмотрел, весь гугл облазил, как использовать эту библиотеку? (JSON...

Как подключить и использовать библиотеку extjs в asp.net mvc 4
Как подключить эту библиотеку и использовать? Простейший бы пример.. Делаю все как подсказывают на оф. сайте и ничего не выходит.....

Какую библиотеку использовать, чтобы найти значение уравнения
С помощью какой библиотеки можно решить уравнение ( F(x) = 0 ): exp(x/2)/2 - 1

Создать новый список из двух других, чтобы он содержал равные элементы из двух других списков
Здравствуйте, подскажите пожалуйста, как можно создать новый список из двух других, чтобы он содержал равные элементы из двух других...

Создать библиотеку javascript и использовать её в коде
Здравствуйте! Возникла проблема с созданием и последующим использованием библиотеки js в своём коде. Никакие найденные в интернете способы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru