Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подключить к C# COM объект 
:(
    Опции темы
lumenxp
Дата 9.4.2010, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



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

Вот пример из мануала
Код

Пример: C#
using S7PROSIMLib;
...
private S7ProSim ps;

Подскажите что означает строка "private S7ProSim ps;"

Далее для подключения функций в том же мануале производитель пишет 
Код

STDMETHOD(CS7ProSim::Connect)()

Но я так понял это код C++ и в C# он не совсем хорошо воспринимается.

Во вложении мануал.



Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  s7wspscb.chm 264,42 Kb
PM MAIL   Вверх
lumenxp
Дата 9.4.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Модификатор "private" запрещает доступ к полям и методам класса извне самого класса.
С эти стало яснее.

Как быть со строкой использования методов из COM объекта  S7PROSIMLib???
PM MAIL   Вверх
mrbrooks
Дата 9.4.2010, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



C# и платформа .NET. Библиотека программиста Троелсен Э.
Глава 12. Взаимодействие с унаследованным программным кодом.

так же:кошерная ссылка


PM MAIL   Вверх
lumenxp
Дата 9.4.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Еще раз повторюсь что совсем недавно работаю с C#.
Ссылку на COM я добавил в самом начале.
Я не знаю как изменить код
Код

STDMETHOD(CS7ProSim::Connect)()

или
Код

S7ProSim1.Connect()

для того что бы С# это понял. 
Есть ли примеры?



Это сообщение отредактировал(а) lumenxp - 9.4.2010, 12:51
PM MAIL   Вверх
lumenxp
Дата 10.4.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Порыскал и нашел примеры.
Щас следующий косяк
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace TestS7
{
    internal sealed class TestS7App

    {
        private S7ProSimClass ps = new S7ProSimClass();
        static void Main()
        {
            ps.Connect();
            ps.SetState("RUN_P");
            System.Console.ReadLine();
        }
    }
}


Вот что выдал компилятор.
ошибка CS0120: Для нестатического поля, метода или свойства "TestS7.TestS7App.ps" требуется ссылка на объект
(Связанное местоположение)

Help!!!
PM MAIL   Вверх
KelTron
Дата 10.4.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace TestS7
{
    internal sealed class TestS7App
    {
        static void Main()
        {
            S7ProSimClass ps = new S7ProSimClass();
            ps.Connect();
            ps.SetState("RUN_P");
            System.Console.ReadLine();
        }
    }
}

Либо:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace TestS7
{
    internal sealed class TestS7App

    {
        private static S7ProSimClass ps = new S7ProSimClass();
        static void Main()
        {
            ps.Connect();
            ps.SetState("RUN_P");
            System.Console.ReadLine();
        }
    }
}



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
lumenxp
Дата 10.4.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Спасибо!!!
Я дико извиняюсь но при усложнении кода возникли аналогичные ошибки

Код

namespace TestS7
{
    internal sealed class TestS7App
    {
        
       private object vData;
        static void Main()
        {
            
            S7ProSimClass ps = new S7ProSimClass();
            ps.Connect();
            ps.SetState("RUN_P");
            System.Console.ReadLine();
            int a = 0;
            int b = 0;
            bool m_bBoolIn = true;
            vData = m_bBoolIn;
            ps.WriteInputPoint(a, b, ref vData);
        }
    }
}

Теперь ругается на vData. 

Это сообщение отредактировал(а) lumenxp - 10.4.2010, 17:20
PM MAIL   Вверх
KelTron
Дата 11.4.2010, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Функция Main статическая, это  значит что в ней можно обращаться только к статическим членам класса, т.е. тебе нужно либо vData сделать статической переменной, либо создавать экземпляр в функции Main. Также как и S7ProSimClass ps.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
lumenxp
Дата 12.4.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Еще раз спасибо KelTron.

Вобщем сделал как вы сказали

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace S7Simulyator_dll
{
    public class Class1
    {
        private object vData;
        public static int Connect()
        {
            S7ProSimClass ps = new S7ProSimClass();
            Class1 vData = new Class1();
            ps.Connect();
            ps.SetState("RUN_P");
            bool m_bBoolIn = true;
            vData = m_bBoolIn;
            ps.WriteInputPoint(0, 1, ref vData);
            return 2;
         }
     }
}

Такие извращения с методом необходимы для того что бы приготовленную мной dll-ку мог скушать матлаб.
Подробнее я тут отписался http://forum.vingrad.ru/forum/topic-282027...2133591/15.html

Возникла новая проблема 
CS1503: Аргумент "3": преобразование типа из "ref bool" в "ref object" невозможно

Я делаю dll-ку на основании уже готового рабочего кода пиложения с экранной формой. 

Код

private void Click_WriteInputPoint(object sender, EventArgs e)
        {
                    int In = int.Parse(PointValueToWrite.Text);
                    if (In == 1)
                    {
                        m_bBoolIn = true;
                    }
                    else
                    {
                        m_bBoolIn = false;
                    }
                    m_nByteIndex = int.Parse(WPointByte.Text);
                    m_nBitIndex = int.Parse(WPointBit.Text);

                    vData = m_bBoolIn;
                    ps.WriteInputPoint(m_nByteIndex, m_nBitIndex, ref vData);

                    MessageBox.Show(MSG_OK, "S7ProSim-Example", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }


Это сообщение отредактировал(а) lumenxp - 12.4.2010, 09:45
PM MAIL   Вверх
KelTron
Дата 12.4.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Цитата(lumenxp @  12.4.2010,  09:43 Найти цитируемый пост)
Вобщем сделал как вы сказали

Не совсем так...

Вообще я уже не понимаю где код, который ты используешь, везде разные куски какие то, приведи полный код, тогда уже можно будет что то сказать.



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
lumenxp
Дата 12.4.2010, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Извините за путаницу.

Код который сейчас использую

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace S7Simulyator_dll
{
    public class Class1
    {
        private object vData;
        public static int Connect()
        {
            S7ProSimClass ps = new S7ProSimClass();
            Class1 vData = new Class1();
            ps.Connect();
            ps.SetState("RUN_P");
            bool m_bBoolIn = true;
            vData = m_bBoolIn;
            ps.WriteInputPoint(0, 1, ref vData);
            return 2;
         }
     }
}


Ошибка при данном коде 
CS1503: Аргумент "3": преобразование типа из "ref bool" в "ref object" невозможно

Такое извращение с методами 
Код

public static int Connect()
.......................
return 2;

необходимо для использования dll-ки в Matlab

PM MAIL   Вверх
KelTron
Дата 13.4.2010, 04:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Мне непонятно что вот это такое, в чём тут смысл?:
Код

Class1 vData = new Class1();


Такое попробуй:
Код

namespace S7Simulyator_dll
{
    public class Class1
    {
        public static int Connect()
        {
            S7ProSimClass ps = new S7ProSimClass();
            ps.Connect();
            ps.SetState("RUN_P");
            object m_bBoolIn = true;
            ps.WriteInputPoint(0, 1, ref m_bBoolIn);
            return 2;
         }
     }
}



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
lumenxp
Дата 13.4.2010, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Дело в том что параметр функции ps.WriteInputPoint под названием vData должен быть object. В противном случае компилятор говорит что 

Наиболее подходящий перегруженный метод для "S7PROSIMLib.S7ProSimClass.WriteInputPoint(int, int, ref object)" имеет несколько недопустимых аргументов
Аргумент "3": преобразование типа из "ref bool" в "ref object" невозможно
PM MAIL   Вверх
KelTron
Дата 13.4.2010, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Смотри код внимательней...


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
lumenxp
Дата 14.4.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Еще раз спасибо!
Простите за невнимательность, и за возможно глупые вопросы.
Указанная вам конструкция действительно заработала.
Я начал усложнять программу и вот что получилось

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace S7Simulyator_dll
{
    public class Class1
    {
        public static int Connect()
        {
            S7ProSimClass ps = new S7ProSimClass();
            ps.Connect();
            ps.SetState("RUN_P");
            return 0;
        }

        public static int SetBitOut()
          {
            bool x = true;
            object vData = x;
            ps.WriteInputPoint(0, 4, ref vData);
            return 0;
         }
    }
}


Ошибка компилятора
Код

Элемент "ps" не существует в текущем контексте.    


Дилитанская попытка вставить S7ProSimClass ps = new S7ProSimClass(); привела к компиляции, но метод так и не отработал.

PM MAIL   Вверх
Alkash
Дата 14.4.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Дык компилятор говорит - что он незнает что такое ps в SetBitOut(), соответственно определи его для всего класса


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
lumenxp
Дата 15.4.2010, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



При объявлении для всего класса, а именно
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using S7PROSIMLib;

namespace S7Simulyator_dll
{
    public class Class1
    {
        S7ProSimClass ps = new S7ProSimClass();
        public static int Connect()
        {
            
            ps.Connect();
            ps.SetState("RUN_P");
            return 0;
        }
......................

Получаем ошибку 
Код

Для нестатического поля, метода или свойства "S7Simulyator_dll.Class1.ps" требуется ссылка на объект

PM MAIL   Вверх
jonie
Дата 15.4.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



у вас функция Connect статическая, и в ней вы обращаетесь к нестатическому члену ps. Либо делайте его статическим, либо функцию Connect НЕ статической


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lumenxp
Дата 15.4.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Ни то ни другое я сделать не могу.
Сделать ps статическим членом нельзя т.к. не будет работать обращение к подключенному COM объекту.
Сделать функцию не статическо не могу т.к. с ней работает Матлаб. И еже она будет не статической он ничего не сможет сотворить.
PM MAIL   Вверх
jonie
Дата 15.4.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата


Сделать ps статическим членом нельзя т.к. не будет работать обращение к подключенному COM объекту.
врете вы всё.

ну хорошо, передавайте в Connect ссылку на Class1, и в функции уже раоботайте через неё.



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lumenxp
Дата 15.4.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Да ничего я не вру!
 smile 
Пожалуйста приведите пример ссылки на класс, который должен отработать в данной конструкции.

Это сообщение отредактировал(а) lumenxp - 15.4.2010, 20:22
PM MAIL   Вверх
jonie
Дата 15.4.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Код

    public class Class1
    {
        readonly S7ProSimClass ps = new S7ProSimClass();  //реадонли для неменяемых объектов - хорошая практика
        public static int Connect(Class1 selfref)
        {
            selfref.ps.Connect();
            selfref.ps.SetState("RUN_P");
            return 0;
        }
    }

//где-то в коде
Class1 cl = new Class1();
Class1.Connect(cl);

но вы врете насчет того что ссылка на COM не может быть статической.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lumenxp
Дата 16.4.2010, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Спасибо за ответ.

Вот что мне выдал Matlab при попытке использовать метод Connect

Код

??? No method 'Connect' with matching signature found for class
'S7Simulyator_dll.Class1'.

Попытки что то изменить в коде не привели к работоспособности.
PM MAIL   Вверх
jonie
Дата 16.4.2010, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



lumenxp, а фиг его знает , как вы там указали сигнатуру..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lumenxp
Дата 16.4.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Код

NET.addAssembly('D:\S7Simulyator_dll.dll');
db1 = S7Simulyator_dll.Class1.Connect();

PM MAIL   Вверх
jonie
Дата 16.4.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



lumenxp, ну правильно, теперь у вас коннект ждет экземпляра класса Class1, сделайте его в матлабе и передайте как параметр...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
lumenxp
Дата 17.4.2010, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.4.2010

Репутация: нет
Всего: нет



Пожалуйста более подробно опишите действия. Что значит сделать в Matlabe экземпляр класса?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1242 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.