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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# vs VB.Net 
V
    Опции темы
hyp1k
  Дата 20.11.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написал класс на vb.net, выгрузил его в dll. Попытки пользовать эту длл в проекте vb.net успешны, в C# не работает. Как такое может быть? Ведь, насколько мне известно, код переводится в промежуточный язык когда заносится в dll?! 

код первого работает
Код

Module Module1
    Sub Main()
        Dim CsGate As ClearScadaGateWrapper.CSGate
        CsGate = New ClearScadaGateWrapper.CSGate("Id", "Name", "Pass")
        CsGate.SetValue("Path", 1, 192, CDate("20.11.2012 09:23:20"), 20)
    End Sub
End Module


Второй не работает
Код

namespace CS_using_CSgate
{
    class Program
    {
        static void Main(string[] args)
        {
            ClearScadaGateWrapper.CSGate CsGate;
            CsGate = new ClearScadaGateWrapper.CSGate("Id", "Name", "Pass");
            CsGate.SetValue("Path", 1, 192, DateTime.Parse("20.11.2012 09:23:20"), 20);
        }
    }
}



ПОЧЕМУ?
PM MAIL   Вверх
lomaster
Дата 20.11.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



что значит не работает?
PM   Вверх
hyp1k
Дата 20.11.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В vb.net проходит подключение и устанавливается значение, по нужному пути, при том отрабатывает быстро и четко. В C# программа подвисает, видимо не подключившись во второй строке, на 3 строке показывает ошибку, System.Runtime.InteropServices.COMException {"No Current Connection"}. Если развернуть информацию об исключении в студии в поле Source значение Serck.ScxV6Server. Т.е. я понимаю, да внутри моей библиотеки не прошло подключение, а член класса сервер в состоянии No Current Connection. Но это не важно, допустим я не знаю, что внутри библиотеки и как оно там работает, черный ящик. Должно работать везде. 

Т.е. возможно, что отличается механизм передачи параметров из программ в функцию, это мой бред, не знаю о чем думать..

Добавлено через 2 минуты и 30 секунд
Класс, выгруженный в dll
Код

Public Class CSGate
    Dim Svr As ScxV6DbClient.ScxV6Server
    Dim Obj As ScxV6DbClient.ScxV6Object
    Dim Hist As ScxV6DbClient.ScxV6Aggregate

    Public Sub New(ByVal ConnectionId As String,
                   ByVal Name As String,
                   ByVal Password As String
                   )
        Svr = New ScxV6DbClient.ScxV6Server
        Svr.Connect(ConnectionId, Name, Password)


    End Sub

    Public Sub SetValue(
                        ByVal Path As String,
                        ByVal Reason As Long,
                        ByVal Quality As Long,
                        ByVal TimeStamp As Date,
                        ByVal Value As Object
                        )
        Obj = Svr.FindObject(Path)
        Hist = Obj.Aggregate("Historic")
        Hist.Interface.LoadDataValue(Reason, Quality, TimeStamp, Value)
        'LoadDataValue Reason(long), Quality(Long), Time Stamp(Time), Value(Variant) 

    End Sub
End Class

PM MAIL   Вверх
diadiavova
Дата 20.11.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



hyp1k, может дата неправильно парсится? Ты ведь поразному её парсишь? Метод парс по умолчанию ( если не ошибаюсь) использует американскую систему, то есть сначала пишется месяц, потом день, потом год. А при использовании конвертера вполне возможно, что используется культура системы.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
lomaster
Дата 20.11.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, дело не в передаче параметров.
Скорее всего в параметрах данные идут не те.
Проверяйте все ли одинаково отправляете.
Ну и под дебагом смотрите что куда идет и где "зависает".

Это сообщение отредактировал(а) lomaster - 20.11.2012, 15:35
PM   Вверх
hyp1k
Дата 20.11.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



lomaster,
Такая проблема не только у меня, человек пользуется библиотекой и говорит, что в шарпе не работает, а в вб работает. Первое предлрожение из его поста. Ошибка у него точно такая же.
http://scadaforum.controlmicrosystems.com/...ord1=Connection

передаю одинаково параметры :(

diadiavova,
        CDate("20.11.2012 09:23:20").Ticks    634890002000000000    Long
        DateTime.Parse("20.11.2012 09:23:20").Ticks    634890002000000000    long

вопрос больше к разработчикам, но работать должно без вопросов...

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


Новичок



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

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



Вот когда я наткнулся на то, что библиотека произодителя в шарпе не работает, а в vb работает, я думал напишу обертку в vb, выгружу в длл и буду использовать в шарпе, оказалось все равно не пашет..
PM MAIL   Вверх
lomaster
Дата 20.11.2012, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что значит обертку и почему не сработало?
PM   Вверх
diadiavova
Дата 20.11.2012, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(hyp1k @  20.11.2012,  16:46 Найти цитируемый пост)
diadiavova,
        CDate("20.11.2012 09:23:20").Ticks    634890002000000000    Long
        DateTime.Parse("20.11.2012 09:23:20").Ticks    634890002000000000    long

Ну собственно я увидел различия в коде и предположил, что из-за них. smile 
А вообще, код на бейсике и на шарпе с виду идентичный совсем даже не обязательно должен на CIL генерировать одно и то же. У бейсика есть множество возможностей ( и ком-взаимодействие одна из областей, ради которых они введены в язык), благодаря которым можно код написать очень сокращенно там, где в шарпе надо все расписывать подробно. Нередко преимущества бейсика в таких ситуациях тут же исчезают, как только включишь режим строгой проверки типов (Option Strict On, по умолчанию он выключен).

В данной ситуации, конечно же можно только гадать в чем именно проблема, поскольку вся картина не видна. Поэтому выскажу еще одно предположение:
В методе SetValue есть следующий код
Код

Hist.Interface.LoadDataValue(Reason, Quality, TimeStamp, Value)
Насколько я понял здесь вызывается метод ком-объекта, которму передаются аргументы. Так вот меня несколько смущает, что там есть пара аргументов типа Long. Дело в том, что Long в COM -  это то же самое, что Int32 в .Net (Integer в бейсике или int в шарпе), а 64-битные целые там вроде вообще не поддерживаются. Вполне возможно, что компилятор бейсика это дело обрабатывает, а шарповский все компилит как есть. Попробуй заменить типы этих параметров.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
hyp1k
Дата 20.11.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за комментарии. Сегодня под конец рабочего открыл IL коды обоих экзешников, они почти идентичны, впал еще в больший ступор. Завтра продолжу... smile 
PM MAIL   Вверх
lomaster
Дата 20.11.2012, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Неужели нельзя проверить установлен конект или нет?
Обламывается у вас по всей видимости именно в Svr.Connect(ConnectionId, Name, Password).
римерно как у этих товарищей - http://scadaforum.controlmicrosystems.com/...p;threadid=1240
PM   Вверх
hyp1k
Дата 21.11.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



lomaster, хорошая ссылка, вчера не нашел ее сам. Открыл их демо проект увидел атрибут [STAThread]. А как раз вчера под вечер смотрел IL коды, они тож отличались на строчку 

.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) 

и действительно рабочий код выглядит вот так:
Код

using System;
namespace CS_using_CSgate
{    
    class Program
    {
        [STAThread]
        static void Main()
        {
            ClearScadaGateWrapper.CSGate CsGate;
            CsGate = new ClearScadaGateWrapper.CSGate("Id", "Name", "Pass");
            CsGate.SetValue("Path", 1, 192, DateTime.Parse("20.11.2012 09:23:20"), 20);
        }
    }
}


Почему vb.net этот атрибут вставляется по умолчанию?! Осталось почитать и разобраться как влияет  [STAThread] на подключение COM объектов.

Спасибо за помощь!

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


Шустрый
*


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

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



Цитата

Осталось почитать и разобраться как влияет  [STAThread] на подключение COM объектов.
 Ну ... http://msdn.microsoft.com/en-us/library/sy...e(v=vs.95).aspx, для сом это важно.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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