Конференция ".Net" » Как в C# работать с OLE объектом [D2005, C#, WinXP]
 
  • SamProf © (15.12.06 11:18) [0]
    Вопрос скорее на знание C# (почумуто документацию по нему нормальный я так и не нашёл). Всю жизнь я сидел в DELPHI. Мне надо подключится к 1C:Предприятию и работать с ней через OLE. В C# толи так всё сложно (хотя как я понял его для этого и делали, чтобы быть простым...). Вот примерный код как я работал c 1C через Delphi.
    procedure TForm1.Button1Click(Sender: TObject);
    var
    onesobj: Olevariant; //OLE-объект программы 1С:Предприятие
    ware: olevariant; //Агрегатные объекты
    begin
    onesobj := createoleobject('V1CEnterprise.Application'); //Создаем OLE-объект
    //Инициализируем объект
    onesobj.initialize(onesobj.rmtrade,'/DE:\TRUKR /M /NСаша /P12345','');
    //Создаем необходимые агрегатные объекты
    ware := onesobj.createobject('Справочник.Номенклатура');
    ware.selectitems(1); //Открываем выборку элементов справочника
    while ware.GetItem(1)>0 do //Выбираем все элементы
    begin
    Memo1.Lines.Add(ware.getAttrib('Наименование'));
    end;
    end;

    Этот же код сделать в C# ятолком так и не смог, точнее скореевсего смогу, но это както сложно выходит....

    protected void Button1_Click(object sender, EventArgs e)
    {
    Type t = null; /* нужна для позднего связывания */
    Object obj = null; /* нужна для ссылки на COM сервер */
    Object book = null; /* нужна для ссылки на объект справочника */
    Object element = null; /* нужна для ссылки на элемент справочника */
    Boolean OK = false;

    /* Вызовем внутренние методы 1С */
    t = Type.GetTypeFromProgID("V77s.Application");

    obj = System.Activator.CreateInstance(t);

    Object[] arg = new Object[3];
    arg[0] = obj.GetType().InvokeMember(@"RMTrade",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, null);
    arg[1] = @"/dE:\TRUKR /n /p";

    OK = (Boolean)obj.GetType().InvokeMember(@"Initialize",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, arg);

    object[] arg2 = new object[] { @"Справочник.Номенклатура" };

    book = obj.GetType().InvokeMember(@"createobject",
    BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, arg2);
    }

    Т.е. смысл в том, что в делфях для вызова метода OLE я просто писал его через точку, в скобках параметры и не парил мозги... а тут както так громоздко.... Поясните, может как то можно вернутся к наглядности кода? или хотябы как можно это всё упростить? Спасибо!
  • DiamondShark © (15.12.06 12:07) [1]
    Ну да, нет в языке поддержки позднего связывания, потому так громоздко.
    А значительно упростить работу можно создав interop assembly на основе нужной библиотеки типов.
  • SamProf © (15.12.06 12:12) [2]
    А не поскажешь что это и как это делать (пример, почиатаь чтото)....
  • DiamondShark © (15.12.06 13:02) [3]
    Понятия не имею, как это делать в BDS.
    В VS достаточно в references проекта добавить библиотеку типов COM, будет сгенерирована interop сборка.
    Наверное, должно быть подобное средство и в BDS.

    Можно воспользоваться утилитой tlbimp.exe из .NET SDK, и полученную сборку включить в проект.

    Почитать можно здесь
    http://msdn2.microsoft.com/en-us/library/z6tx9dw3(VS.71).aspx
  • SamProf © (15.12.06 13:11) [4]
    Я и делаю в VS, но есть проблемка:
    в реестре написано, что контейнер :C:\PROGRA~1\1Cv77\BIN\1cv7s.exe. Када я я его пытаюсь добавить, то пишет, что No types librarys were found. короче что в нём нифига нет.... в близлижащих дллках тоже ничё не нашёл....
    как быть?
  • SamProf © (15.12.06 13:16) [5]
    HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}: V77.Application
    HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\InprocHandler32\:ole32.dll
    HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\LocalServer32: C:\PROGRA~1\1Cv77\BIN\1cv7s.exe
    HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\ProgID: V77.Application
  • DiamondShark © (15.12.06 14:07) [6]
    А зачем искать по реестру? При добавлении ссылки показываются все зарегистрированные библиотеки типов. Неужели её там нет?
  • SamProf © (15.12.06 15:21) [7]
    В том то и дело, что нет....
    Может я чегото не понимаю... просто это получается не COM объект, а OLE.... может это на что то влияет?
  • DiamondShark © (15.12.06 19:10) [8]
    Раскопки на машине с установленной 1С показали, что она, по-видимому, действительно не регистрирует библиотеку типов для своих automation-объектов, и, скорее всего, её и не содержит.

    Печально, но придётся-таки писать длинные заклинания.

    :(
 
Конференция ".Net" » Как в C# работать с OLE объектом [D2005, C#, WinXP]
Есть новые Нет новых   [134430   +2][b:0][p:0]