Показать сообщение отдельно
Старый 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).