Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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