Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > C# vs VB.Net


Автор: hyp1k 20.11.2012, 14:42
Написал класс на 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);
        }
    }
}



ПОЧЕМУ?

Автор: lomaster 20.11.2012, 14:51
что значит не работает?

Автор: hyp1k 20.11.2012, 15:10
В 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

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

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

Автор: hyp1k 20.11.2012, 15:46
lomaster,
Такая проблема не только у меня, человек пользуется библиотекой и говорит, что в шарпе не работает, а в вб работает. Первое предлрожение из его поста. Ошибка у него точно такая же.
http://scadaforum.controlmicrosystems.com/forum/messageview.cfm?catid=51&threadid=2067&highlight_key=y&keyword1=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, 16:20
Вот когда я наткнулся на то, что библиотека произодителя в шарпе не работает, а в vb работает, я думал напишу обертку в vb, выгружу в длл и буду использовать в шарпе, оказалось все равно не пашет..

Автор: lomaster 20.11.2012, 17:44
Что значит обертку и почему не сработало?

Автор: diadiavova 20.11.2012, 20:53
Цитата(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-битные целые там вроде вообще не поддерживаются. Вполне возможно, что компилятор бейсика это дело обрабатывает, а шарповский все компилит как есть. Попробуй заменить типы этих параметров.

Автор: hyp1k 20.11.2012, 22:19
Спасибо за комментарии. Сегодня под конец рабочего открыл IL коды обоих экзешников, они почти идентичны, впал еще в больший ступор. Завтра продолжу... smile 

Автор: lomaster 20.11.2012, 22:49
Неужели нельзя проверить установлен конект или нет?
Обламывается у вас по всей видимости именно в Svr.Connect(ConnectionId, Name, Password).
римерно как у этих товарищей - http://scadaforum.controlmicrosystems.com/forum/messageview.cfm?catid=51&threadid=1240

Автор: hyp1k 21.11.2012, 09:25
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 объектов.

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

Автор: lomaster 21.11.2012, 09:45
Цитата

Осталось почитать и разобраться как влияет  [STAThread] на подключение COM объектов.
 Ну ... http://msdn.microsoft.com/en-us/library/system.stathreadattribute(v=vs.95).aspx, для сом это важно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)