Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте. Имеется заголовочный 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2014, 17:49
Ответы с готовыми решениями:

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

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

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

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

15
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
19.07.2014, 03:12 2
Цитата Сообщение от anakinskyoker Посмотреть сообщение
Я задался целью, сделать управляемую библиотеку, чтобы использовать ее в будущем в моих .Net проектах.
Ну так перепишите на VB.NET
1
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
19.07.2014, 04:08  [ТС] 3
Цитата Сообщение от MrCold Посмотреть сообщение
Сообщение от anakinskyoker
Я задался целью, сделать управляемую библиотеку, чтобы использовать ее в будущем в моих .Net проектах.
Ну так перепишите на VB.NET
Спасибо, но это не вариант. Уже пробовал это делать, и на Vb.net и на C#. Не вышло.
А можно как-нибудь заменить шаблон функции template на указатель? Как-то через typedef реализовать?
0
Универсальный программист
41 / 33 / 9
Регистрация: 21.12.2013
Сообщений: 374
Записей в блоге: 1
19.07.2014, 04:12 4
Цитата Сообщение от anakinskyoker Посмотреть сообщение
А можно как-нибудь заменить шаблон функции template на указатель?
разве что объявить глобальной
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
19.07.2014, 05:02 5
Цитата Сообщение от 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  [ТС] 6
Цитата Сообщение от 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 7
Вообще, C# поддерживает шаблоны.
http://msdn.microsoft.com/en-u... ad0zb.aspx
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
21.07.2014, 19:45 8
CheshireCat, там ни к чему генерики. Если на С# переписывать, то там один тип делегата на всю
библиотеку.
0
0 / 0 / 0
Регистрация: 18.06.2014
Сообщений: 14
31.07.2014, 09:00  [ТС] 9
Цитата Сообщение от 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
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
31.07.2014, 10:56 10
функции неверно принимают массивы. вот тут все написано (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  [ТС] 11
Цитата Сообщение от 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
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
31.07.2014, 15:25 12
1 метод, как я понял, это и есть передача указателя в C-стиле
2 метод, это когда мы принимаем настоящий safearray
наверное, 1 метод лучше ибо зачем нам мучиться?
1
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
31.07.2014, 15:41 13
Прошелся отладчиком , все массивы возвращаются из длл длинной равной единице.
Жестко размер укажите в параметрах, должно помочь.
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  [ТС] 14
Цитата Сообщение от 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
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
31.07.2014, 20:56 15
а где выкидывает?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
01.08.2014, 12:59 16
Лучший ответ Сообщение было отмечено 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
01.08.2014, 12:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2014, 12:59
Помогаю со студенческими работами здесь

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

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

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

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

Какую библиотеку использовать, чтобы прослушивать/изменять громкость нескольких треков одновременно
Прошу подскажите какую библиотеку использовать совместимую с XE7, прослушивать/изменять громкость...

Как создать библиотеку для .NET?
Господа программисты, я вроде человек не глупый, но что-то не могу понять как правильно в VS2010 из...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru