|
11.03.2008, 10:03 | #1 |
Участник
|
Проблема с самописной DLL.
Здравствуйте.
Версия Axapta 3.0 SP5FP2, MSSQL. Хочу для общего развития научиться подключать свои разработки в Аксапту на .NET. Создал ClassLibrary проект на VisualStudio/ Написал DLL на С#, в которой (для простого примера) хочу использовать в аксапте метод ADD. PHP код:
X++: DLL dlll = new DLL("Example"); DLLFunction f; ; f = new DLLFunction(dll, "ADD"); Цитата:
DLL Function not found ADD
Object 'DLLFunction' could not be created Почему в библиотеке не виден метод "ADD"? Спасибо. |
|
11.03.2008, 10:18 | #2 |
Microsoft Dynamics
|
Необходимо добавить Reference на сборку, создать экземпляр класса из сборки обычным способом, через new, вызвать метод класса. Подробности - в документации по разработке.
__________________
You should use Bing before asking dumb questions. |
|
11.03.2008, 18:34 | #3 |
MCTS
|
Dynamics и .NET
Посмотрите по этой ссылке:
Dynamics и .net (Dot net rocks) |
|
11.03.2008, 18:45 | #4 |
MCT
|
да да я писал на эту тему
|
|
11.03.2008, 20:19 | #5 |
Участник
|
Что прежде всего бросилось в глаза.
В шарпе у вас метод называется Add, а в DLLFuntion - ADD. Возможно это и не имеет значения. Но попробовать стоит |
|
12.03.2008, 09:15 | #6 |
Участник
|
Цитата:
Сообщение от MikeR
да да я писал на эту тему
Спасибо. Полезно, но справедливо для DAX4. Цитата:
Сообщение от Jabberwocky
Необходимо добавить Reference на сборку, создать экземпляр класса...
Цитата:
Сообщение от kashperuk
В шарпе у вас метод называется Add, а в DLLFuntion - ADD.
Возможно это и не имеет значения. Но попробовать стоит Попробую создать сборку из командной строки, есть подозрение, что метод не виден из-за нахождения класса внутри namespace ("Example"). Хотя обращение типа: X++: new DLLFunction(dll,"Example.Add") |
|
12.03.2008, 09:50 | #7 |
Участник
|
Сильно подозреваю, что юзать в 3.0 NETовские сборки не получится ! Поскольку Ax 3 ничего о NET не знает в принципе!
|
|
12.03.2008, 09:59 | #8 |
Участник
|
|
|
12.03.2008, 10:20 | #9 |
MCITP
|
Конечно же нельзя так делать. К тому вы используете некорректную терминологию. В .NET нет привычных в понимании Win32 DLL - это в чистом виде assembly, сборки, лишь по расширению наводящие на мысль о сходстве. 3-я Axapta может подключать только классические Win32 DLL, имеющие DLLEntryPoint - точку входа :-) Из которых к тому же, насколько я понимаю можно экспортировать лишь функции - и нельзя экспортировать классы.
.NET assembly не равно Win 32 DLL! |
|
12.03.2008, 10:52 | #10 |
Microsoft Dynamics
|
Цитата:
Сообщение от Demetrio
Конечно же нельзя так делать. К тому вы используете некорректную терминологию. В .NET нет привычных в понимании Win32 DLL - это в чистом виде assembly, сборки, лишь по расширению наводящие на мысль о сходстве. 3-я Axapta может подключать только классические Win32 DLL, имеющие DLLEntryPoint - точку входа :-) Из которых к тому же, насколько я понимаю можно экспортировать лишь функции - и нельзя экспортировать классы.
.NET assembly не равно Win 32 DLL!
__________________
You should use Bing before asking dumb questions. |
|
|
За это сообщение автора поблагодарили: Logger (1), VAlek (1). |
25.12.2008, 16:39 | #11 |
Участник
|
у меня возникла такая же проблема 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 |
Участник
|
Цитата:
Сообщение от 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 ? |
|
25.12.2008, 17:48 | #13 |
Участник
|
я если четно не совсем понял где тут смотреть секцию Export
насколько я понял проблема в том что Axapta может работать только с Win32 DLL. Можно как то "переколбасить" мою .NET в Win32 DLL? |
|
26.12.2008, 09:49 | #14 |
Участник
|
В этом окне нажмите кнопку Directories, далее найдите Export Directories и нажмите кнопку рядом с ней. Появится список функций, в нем ищите свою.
|
|
26.12.2008, 10:33 | #15 |
Участник
|
понятно, к сожалению:
--------------------------- PE Tools v1.5 Xmas Edition --------------------------- Export Table not present ! --------------------------- ОК --------------------------- |
|
26.12.2008, 14:33 | #16 |
Участник
|
Почитайте тут 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") Последний раз редактировалось _scorp_; 26.12.2008 в 14:38. |
|
28.12.2008, 10:37 | #18 |
Участник
|
C# dll в Axapta 3.0
Пробовал, ничего не помогает, в аксапте полученный Com объект невозможно создать, хотя регистрируется успешно, в GAC устанавливается и в реестре прописываются нужные ключи.
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; } } } 4.Теперь полученную dll можно использовать в управляемых приложениях. Но нам нужно получить доступ к dll из неуправляемого приложения, а в C# нет синтаксических конструкций для подобного объявления. Зато в IL есть. Поэтому, нужно дизассемблировать полученную dll выполнив в командной строке visual studio X++: Ildasm c:\prodjectPath\TestNetDll.dll out:c:\prodjectPath\TestNetDll.il 6.Находим метод SumInt и добавлем в него сразу после открывающей фигурной скобки следующие строки X++: .vtentry 1:1 .export [1] as sumInt .export [НомерЭкспортируемойФункции] as НазваниеЭкспортируемойФункции 7.В методе MultInt вставляем X++: .vtentry 1:2 .export [2] as sumInt 8.Компилируем X++: Ilasm c:\ProjectPath\TestNetDll.il /dll /out:c:\ProjectPath\TestNetDll.dll 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). |
26.12.2008, 17:05 | #19 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: belugin (5), aidsua (1), _scorp_ (2). |