none
Как объявить методы класса С#, чтобы они были видны COM приложению, до создания экземпляра объекта. RRS feed

  • Вопрос

  • Добрый день, подскажите, 

    Как объявить методы класса С#, чтобы они были видны COM приложению.

    создал Интерфейс, создал Класс, зарегистрировал все в СОМ, 
    а в итоге при попытке получить доступ из другого приложения к Методам Класса, не вижу методов.

    объект из класса создается, но методов его не видны.

    А мне нужно их объявить так чтобы они были видны у данного объекта, еще до того как я создал экземпляр объекта.

    Надеюсь понятно описал.
    Помогите пожалуйста :((((((( Очень нужно!!!  

    //=============================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using V81;
    
    namespace ClassLibraryConectComBase
    {
     [ComImport]
     [Guid("C277469A-E47F-4F29-A610-3A8238E56378")]
    
     public interface ConectComBaseInterface
     {
      void FastConectBase1C8(string ConectString);
      void FastWriteBase1C8();
     }
     public class ConectComBase1C8 : ConectComBaseInterface
     {
      public dynamic OleBaseConector;
    
      public void FastConectBase1C8(string ConectString)
      {
       var OleBase = new V81.COMConnector();
       OleBaseConector = OleBase.Connect(ConectString); ;
      }
    
      public void FastWriteBase1C8()
      {
       OleBaseConector.WriteOneInTime();
      }
     }
    }
    


     

    • Изменено WinnerBoy 20 августа 2010 г. 13:30
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:31 MSDN Forums consolidation (От:Visual C#)
    18 августа 2010 г. 15:38

Ответы

  • УРА!!! заработало!!! правда фих знает почему, но заработало!!!

    кажется атрибут [ComImport] был лишним. у меня все в одно файле было и интерес и класс!

    :))))))
    • Помечено в качестве ответа I.Vorontsov 23 августа 2010 г. 5:54
    20 августа 2010 г. 13:12

Все ответы

  • Может быть нужно прописать какие-то атрибуты для методов?????

    типа  [ComVisibleAttribute(true)] ,
    но во первых у меня для для всей сборки стоит этот атрибут,
    а во вторых пробывал ставить его перед классом и перед всеми опубликованными методами, все равно не помогает. :(:(:(:(:(:(:(:(:(

     HELP ME!!!!!!!! 
    20 августа 2010 г. 7:43
  • Как я вижу это ты подключаешься к 1С'ке.

    Методов ты не увидишь. В лучшем случае, несколько интерфейсов и конструкторов. Но это если ты добавишь COM-объект через диспетчер ссылок. 

    А так с 1С'кой приходится работать с помощью метода рефлексии.

    Вот пример программы, которая поучает количество справочников в информационной базе:

     

    using System;
    using System.Reflection;
    
    namespace ConsoleApplication2
    {
      class Program
      {
        static void Main(string[] args)
        {
          try
          {
            Type v82ComConnectorType = Type.GetTypeFromProgID("V82.COMConnector");
            object v82_connecter = Activator.CreateInstance(v82ComConnectorType);
    
    
            string strCon = "File=\"D:\\1C Предприятие\\Базы данных\\Версия 8.2\\1c8.Бухгалтерия\";";
            Object[] arguments = { strCon };
    
    
            var v82 = v82_connecter.GetType().InvokeMember("Connect",
                                    BindingFlags.Public |
                                    BindingFlags.InvokeMethod |
                                    BindingFlags.Static,
                                    null,
                                    v82_connecter,
                                    arguments);
    
    
            var метаданные = GetObjectProperty(v82, v82, "Метаданные");
            var справочники = GetObjectProperty(v82, метаданные, "Справочники");
            var количество = InvokeObjectMethod(v82, справочники, "Количество", new Object[] { });
            int count = (int)количество;
    
            Console.WriteLine("Количество справочников: " + count);
          }
          catch (Exception e)
          {
            Console.WriteLine(e.ToString());
          }
          Console.Read();
        }
    
        public static object GetObjectProperty(object v81, object refObject, string propertyName)
        {
          return v81.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, refObject, null);
        }
    
        public static object InvokeObjectMethod(object v81, object refObject, string methodName, Object[] parameters)
        {
          return v81.GetType().InvokeMember(methodName, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, refObject, parameters);
        }
      }
    }
    
    
    И вся работа с 1C'кой происходит по такому принципу.

     

    20 августа 2010 г. 9:22
  • Как я вижу это ты подключаешься к 1С'ке.

    ....

    Ух ты!!! Спасибо за пример, да он пригодится на будущее. :)

    я действительно работаю с 1С, но у меня несколько другая задача. 

    мне нужно вызвать из другого приложения (в частности это LabView), метод который находится в конфигурации самой базы 1С (это метод "WriteOneInTime()"),  но понятное дело метода 1С не видно.
    Поэтому, я решил написать такой мост для связи: LabView - (моя dll) - 1С8

    конект  (моя dll) - 1С8 получился хороший:

     

     dynamic OleBase = new V81.COMConnector();
     dynamic OleBaseConector = OleBase.Connect(ConectString); 
     OleBaseConector.WriteOneInTime();

     

    А вот LabView - (моя dll) происходит странная ситуация мой класс

     

     public class ConectComBase1C8 : ConectComBaseInterface

     

    она увидела хорошо а вот методов класса не видит. хотя я их и в интерфесе объявил, и в классе реализовал. :((((

     

     public void FastConectBase1C8(string ConectString){...};
     public void FastWriteBase1C8(){...};

     

    наверно я их неправильно объявил?
    или еще нужно где-то их регистрировать может в реестре или где... ?

    :(:(:(:(:(:(:(:(:(:(:(

    подробно моя проблема описана на этом форуме: http://www.labview.ru/forum/viewtopic.php?t=10954

    • Изменено WinnerBoy 20 августа 2010 г. 13:34
    20 августа 2010 г. 12:02
  • УРА!!! заработало!!! правда фих знает почему, но заработало!!!

    кажется атрибут [ComImport] был лишним. у меня все в одно файле было и интерес и класс!

    :))))))
    • Помечено в качестве ответа I.Vorontsov 23 августа 2010 г. 5:54
    20 августа 2010 г. 13:12
  • Если пример полезный =) ставь плюсик =)
    20 августа 2010 г. 15:12