T. Ramesh Kumar Ответов: 3

Преобразуйте код vb6.0 в c#.


Hello Experts,

I getting problem converting vb6.0 code into c#


Declare Function GSSymbol Lib "GSWDLL32.DLL" (ByVal fxOrg#, ByVal fyOrg#, ByVal nSymbol&, ByVal nClr&) As Long


Thanks,
T.Ramesh Kumar


Что я уже пробовал:

[DllImport("GSWDLL32.DLL", SetLastError = true)]
        public static extern long GSSymbol(
            long fxOrg, 
            long fyOrg, 
            long nSymbol, 
            long nClr
       );



ошибка :-
<pre>Managed Debugging Assistant 'PInvokeStackImbalance' : 'A call to PInvoke function 'CTTS!CTTS.CTTSUtils::GSSymbol' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the 

3 Ответов

Рейтинг:
1

CHill60

Я не поклонник преобразования из VB6, скорее я использую его в качестве доказательства концепции или "спецификации" для финала .Сетевое приложение - тоже полезный источник результатов тестирования.

В свете такого подхода вы, возможно, захотите рассмотреть вопрос о замене использования GSWDLL32 что-нибудь более современное - например, Диаграмма Класса (Система.Окна.Формы.DataVisualization.Построение Графиков) | Microsoft Docs[^]


Maciej Los

Хороший совет!

Рейтинг:
0

Richard Deeming

Ваше сопоставление типов неверно. Декларация VB6 такова:

... (ByVal fxOrg As Double, ByVal fyOrg As Double, ByVal nSymbol As Long, ByVal nClr As Long) As Long
Ввод Символов - Visual Basic | Microsoft Docs[^]

Но Long в VB6 имеется в виду 32-разрядное целое число. В .NET это очень важно. Int32, который сопоставляется с Integer в VB.NET и еще int в C#.

Таким образом, чтобы соответствовать вашему коду VB6, ваша декларация C# должна быть:
[DllImport("GSWDLL32.DLL", SetLastError = true)]
public static extern int GSSymbol(
    double fxOrg, 
    double fyOrg, 
    int nSymbol, 
    int nClr
);


Maciej Los

5ed!

T. Ramesh Kumar

Спасибо всем "экспертам" за хороший совет.
давайте попробуем все коды один за другим.

Рейтинг:
0

Maciej Los

Проверить это: Класс DllImportAttribute (System.Runtime.InteropServices) | Майкрософт Документы[^].

Там есть несколько полей для установки:

BestFitMapping
CallingConvention
CharSet
EntryPoint
ExactSpelling
PreserveSig
SetLastError
ThrowOnUnmappableChar