AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.03.2008, 10:03   #1  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Регистрация: 13.06.2006
Проблема с самописной DLL.
Здравствуйте.
Версия Axapta 3.0 SP5FP2, MSSQL.

Хочу для общего развития научиться подключать свои разработки в Аксапту на .NET.

Создал ClassLibrary проект на VisualStudio/
Написал DLL на С#, в которой (для простого примера) хочу использовать в аксапте метод ADD.
PHP код:
publicclass Example 
{
     public 
Example()
     {
     }
 
     public 
int Add(int val1,int val2)
     {
          return 
val1+val2;
     }

Далее в аксапте пытаюсь подключить свою DLL
X++:
DLL dlll = new DLL("Example");
DLLFunction f;
;
f    = new DLLFunction(dll, "ADD");
При инициализации DLLFunction получаю ошибку:
Цитата:
DLL Function not found ADD
Object 'DLLFunction' could not be created
Подскажите реализацию написания такой DLL.
Почему в библиотеке не виден метод "ADD"?
Спасибо.
Старый 11.03.2008, 10:18   #2  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Необходимо добавить Reference на сборку, создать экземпляр класса из сборки обычным способом, через new, вызвать метод класса. Подробности - в документации по разработке.
__________________
You should use Bing before asking dumb questions.
Старый 11.03.2008, 18:34   #3  
IvanOFF is offline
IvanOFF
MCTS
MCBMSS
 
65 / 87 (3) ++++
Регистрация: 22.09.2005
Адрес: Москва
Dynamics и .NET
Посмотрите по этой ссылке:
Dynamics и .net (Dot net rocks)
Старый 11.03.2008, 18:45   #4  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
да да я писал на эту тему
Старый 11.03.2008, 20:19   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Что прежде всего бросилось в глаза.
В шарпе у вас метод называется Add, а в DLLFuntion - ADD.
Возможно это и не имеет значения. Но попробовать стоит
Старый 12.03.2008, 09:15   #6  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Регистрация: 13.06.2006
Цитата:
Сообщение от MikeR
да да я писал на эту тему


Спасибо. Полезно, но справедливо для DAX4.
Цитата:
Сообщение от Jabberwocky
Необходимо добавить Reference на сборку, создать экземпляр класса...
Это тоже можно реализовать в четверке, но у меня 3.0 SP5. Узла Reference нет в репозитарии.
Цитата:
Сообщение от kashperuk
В шарпе у вас метод называется Add, а в DLLFuntion - ADD.
Возможно это и не имеет значения. Но попробовать стоит
Попробовал, не получилось.

Попробую создать сборку из командной строки, есть подозрение, что метод не виден из-за нахождения класса внутри namespace ("Example"). Хотя обращение типа:
X++:
new DLLFunction(dll,"Example.Add")
трактуется компилятором с той же ошибкой. Буду пробовать дальше. Спасибо.
Старый 12.03.2008, 09:50   #7  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Сильно подозреваю, что юзать в 3.0 NETовские сборки не получится ! Поскольку Ax 3 ничего о NET не знает в принципе!
Старый 12.03.2008, 09:59   #8  
VAlek is offline
VAlek
Участник
 
12 / 10 (1) +
Регистрация: 13.06.2006
Цитата:
Сообщение от egorych Посмотреть сообщение
Сильно подозреваю, что юзать в 3.0 NETовские сборки не получится ! Поскольку Ax 3 ничего о NET не знает в принципе!
Прихожу к такому же выводу все больше и больше. Межпрограмное взаимодействие походу дела(самописное) - только COM .
Старый 12.03.2008, 10:20   #9  
Demetrio is offline
Demetrio
MCITP
Аватар для Demetrio
MCP
MCBMSS
 
24 / 11 (1) +
Регистрация: 17.12.2007
Адрес: Москва
Конечно же нельзя так делать. К тому вы используете некорректную терминологию. В .NET нет привычных в понимании Win32 DLL - это в чистом виде assembly, сборки, лишь по расширению наводящие на мысль о сходстве. 3-я Axapta может подключать только классические Win32 DLL, имеющие DLLEntryPoint - точку входа :-) Из которых к тому же, насколько я понимаю можно экспортировать лишь функции - и нельзя экспортировать классы.

.NET assembly не равно Win 32 DLL!
Старый 12.03.2008, 10:52   #10  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Цитата:
Сообщение от Demetrio Посмотреть сообщение
Конечно же нельзя так делать. К тому вы используете некорректную терминологию. В .NET нет привычных в понимании Win32 DLL - это в чистом виде assembly, сборки, лишь по расширению наводящие на мысль о сходстве. 3-я Axapta может подключать только классические Win32 DLL, имеющие DLLEntryPoint - точку входа :-) Из которых к тому же, насколько я понимаю можно экспортировать лишь функции - и нельзя экспортировать классы.

.NET assembly не равно Win 32 DLL!
Если говорить "в общем и целом" это правильно, но есть маленький нюанс. .NET Framework позволяет регистририровать сборки для использования обычными клиентами COM. Это можно сделать с помощью утилиты Assembly Registration Tool (Regasm.exe), которая входит в состав .NET Framework. Она создает прокси-сборку и регистрирует её в реестре.
__________________
You should use Bing before asking dumb questions.
За это сообщение автора поблагодарили: Logger (1), VAlek (1).
Старый 25.12.2008, 16:39   #11  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
у меня возникла такая же проблема Axapta 3.0. сделал библиотеку на C#
воспользовался regasm.exe, в коммандной строке ввел "regasm.exe test.dll" , которая написала мне "Типы зарегистрированы успешно"
потом положил dll в папку ..client\bin\

но эффекта никакого не увидел, такая же ошибка:
DLL Function not found testFunc
Object 'DLLFunction' could not be created


как можно, если можно вообще использовать библиотеки написанные на .NET ?

Последний раз редактировалось if_maks; 25.12.2008 в 16:47.
Старый 25.12.2008, 16:50   #12  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от if_maks Посмотреть сообщение
у меня возникла такая же проблема Axapta 3.0. сделал библиотеку на C#
воспользовался regasm.exe, в коммандной строке ввел "regasm.exe test,dll" , которая написала мне "Типы зарегистрированы успешно"
потом положил dll в папку ..client\bin\

но эффекта никакого не увидел, такая же ошибка:
DLL Function not found testFunc
Object 'DLLFunction' could not be created


как можно, если можно вообще использовать библиотеки написанные на .NET ?
Возьмите любой PE Editor и откройте им свою dll. Посмотрите как выглядит ваша функция в секции export. Если там указано просто имя функции, например, testFunc, то проблема в аксапте, должно работать. Если в секции export указано другое имя (testFuncW или как-то еще), то попробуйте указать в аксапте его. Если такой функции в секции export нет, то скорее всего с помощью DLLFunction до данной функции недобраться.
Старый 25.12.2008, 17:48   #13  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
я если четно не совсем понял где тут смотреть секцию Export


насколько я понял проблема в том что Axapta может работать только с Win32 DLL. Можно как то "переколбасить" мою .NET в Win32 DLL?
Старый 26.12.2008, 09:49   #14  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
В этом окне нажмите кнопку Directories, далее найдите Export Directories и нажмите кнопку рядом с ней. Появится список функций, в нем ищите свою.
Старый 26.12.2008, 10:33   #15  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
понятно, к сожалению:
---------------------------
PE Tools v1.5 Xmas Edition
---------------------------
Export Table not present !
---------------------------
ОК
---------------------------
Старый 26.12.2008, 14:33   #16  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Почитайте тут http://msdn.microsoft.com/ru-ru/library/tzat5yw6.aspx Вкратце: Регистрация .Net dll с помощью утилиты regasm приводит к тому что dll можно будет использовать как COM объект. Т.е. все ваши public классы в dll получат свои CLSID и ProgId. Получается что в аксапте нужно будет использовать конструкцию
X++:
Com myCom;
;
Com myCom = new Com("MyNamespace.MyClass");
myCom.MyFunctionName();
Вместо
X++:
DLLFunction dllFunction;
DLL dll;
;
dll = new DLL(@"c:\test.dll");
dllFunction = new DLLFunction(dll,"MyNamespace.MyClass.MyFunctionName")
Но вот только это почему-то не работает. Или нужно делать что-то еще или Axapta 3.0 все таки невозможно подружить с .Net

Последний раз редактировалось _scorp_; 26.12.2008 в 14:38.
Старый 26.12.2008, 17:05   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
How to make a C-like export in .Net
За это сообщение автора поблагодарили: belugin (5), aidsua (1), _scorp_ (2).
Старый 28.12.2008, 10:37   #19  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
C# dll в Axapta 3.0
Цитата:
Пробовал, ничего не помогает, в аксапте полученный Com объект невозможно создать, хотя регистрируется успешно, в GAC устанавливается и в реестре прописываются нужные ключи.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Cпасибо, так получилось. Решил накидать простенький примерчик
1.Создаем в VS проект C# Class Library c именем TestNetDll.
2.Пишем простенький класс, в котором будут присутствовать два экспортируемых метода.
X++:
using System;

namespace TestNetDll
{
    public class TestClass
    {
        public static int SumInt(int a, int b)
        {
            return a + b;
        }

        public static int MultInt(int a, int b)
        {
            return a * b;
        }
    }
}
3.Компилируем проект.
4.Теперь полученную dll можно использовать в управляемых приложениях. Но нам нужно получить доступ к dll из неуправляемого приложения, а в C# нет синтаксических конструкций для подобного объявления. Зато в IL есть. Поэтому, нужно дизассемблировать полученную dll выполнив в командной строке visual studio
X++:
Ildasm c:\prodjectPath\TestNetDll.dll out:c:\prodjectPath\TestNetDll.il
5.Открываем текстовым редактором полученный файл TestNetDll.il
6.Находим метод SumInt и добавлем в него сразу после открывающей фигурной скобки следующие строки
X++:
.vtentry 1:1
.export [1] as sumInt
где, .vtentry НомерТаблицыЭкспортируемыхФункций:НомерЭкспортируемойФункции
.export [НомерЭкспортируемойФункции] as НазваниеЭкспортируемойФункции
7.В методе MultInt вставляем
X++:
.vtentry 1:2
.export [2] as sumInt
7.Сохраняем изменения.
8.Компилируем
X++:
Ilasm c:\ProjectPath\TestNetDll.il /dll /out:c:\ProjectPath\TestNetDll.dll
9.Пример использования в Axapta
X++:
static void Job(Args _args)
{
    DLL         dll;
    DLLFunction dllFunction;
    int res;
    ;
    dll = new Dll(@"c:\ProjectPath\TestNetDll.dll");
    dllFunction = new DllFunction(dll, "MultInt");
    dllFunction.arg(ExtTypes::Word, ExtTypes::Word);
    dllFunction.returns(ExtTypes::Word);
    res = dllFunction.call(5, 10);
    info(int2str(res));
}
За это сообщение автора поблагодарили: if_maks (1), belugin (5), Logger (5), Ace of Database (3), Ar (1), arhat (1).
Теги
dll, visual studio, интеграция, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axStart: Programming against a DLL. Blog bot DAX Blogs 2 28.03.2008 12:56
склонение ФИО и использование dll библиотеки NetBus DAX: Программирование 11 23.10.2007 14:00
Client Axapta 3.0 SP4 и Linux. Как запустить? Daiver DAX: Администрирование 10 28.06.2007 15:59
Axapta Lessons: Axapta DLLs Blog bot DAX Blogs 0 28.10.2006 18:22
при вызове функции из своей DLL, вылетает ошибка Delfins DAX: Программирование 9 07.03.2006 19:29
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:25.