| 
			
			 | 
		#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"? Спасибо.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Microsoft Dynamics 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Необходимо добавить Reference на сборку, создать экземпляр класса из сборки обычным способом, через new, вызвать метод класса. Подробности - в документации по разработке.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	You should use Bing before asking dumb questions.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
			
			
			Dynamics и .NET
			 
			
			Посмотрите по этой ссылке: 
		
		
		
		
		
		
		
	Dynamics и .net (Dot net rocks)  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 MCT 
		
			
	 | 
	
	
	
		
		
		
		 
			
			да да я писал на эту тему  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Что прежде всего бросилось в глаза. 
		
		
		
		
		
		
			
		
		
		
		
	В шарпе у вас метод называется Add, а в DLLFuntion - ADD. Возможно это и не имеет значения. Но попробовать стоит  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от MikeR
			
			 
да да я писал на эту тему  
		
	![]() Спасибо. Полезно, но справедливо для DAX4. Цитата: 
	
		
			Сообщение от Jabberwocky 
			
			 
Необходимо добавить Reference на сборку, создать экземпляр класса... 
		
	Цитата: 
	
		
			Сообщение от kashperuk 
			
			 
В шарпе у вас метод называется Add, а в DLLFuntion - ADD. 
		
	Возможно это и не имеет значения. Но попробовать стоит Попробую создать сборку из командной строки, есть подозрение, что метод не виден из-за нахождения класса внутри namespace ("Example"). Хотя обращение типа: X++: new DLLFunction(dll,"Example.Add")  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сильно подозреваю, что юзать в 3.0 NETовские сборки не получится ! Поскольку Ax 3 ничего о NET не знает в принципе!
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 MCITP 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Конечно же нельзя так делать. К тому вы используете некорректную терминологию. В .NET нет привычных в понимании Win32 DLL - это в чистом виде assembly, сборки, лишь по расширению  наводящие на мысль о сходстве.  3-я  Axapta  может подключать только  классические Win32 DLL, имеющие DLLEntryPoint - точку входа :-) Из которых к тому же, насколько я понимаю можно экспортировать лишь функции - и нельзя экспортировать классы. 
		
		
		
		
		
		
		
	.NET assembly не равно Win 32 DLL!  | 
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#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 ?  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			я если четно не совсем понял где тут смотреть секцию Export 
		
		
		
		
		
		
		
	![]() насколько я понял проблема в том что Axapta может работать только с Win32 DLL. Можно как то "переколбасить" мою .NET в Win32 DLL?  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В этом окне нажмите кнопку Directories, далее найдите Export Directories и нажмите кнопку рядом с ней. Появится список функций, в нем ищите свою.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			понятно, к сожалению: 
		
		
		
		
		
		
		
	--------------------------- PE Tools v1.5 Xmas Edition --------------------------- Export Table not present ! --------------------------- ОК ---------------------------  | 
| 
	
 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
|
| За это сообщение автора поблагодарили: belugin (5), aidsua (1), _scorp_ (2). | |
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			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). | |