Как использовать dll для VB.net на C # - PullRequest
0 голосов
/ 30 августа 2018

У меня есть dll и пример кода с использованием VB.net. Однако мне нужно использовать функции в E5KDAQ.vb, используя файл E5KDAQ.dll на C #. Могу ли я узнать, как этого добиться?

Кто-нибудь может привести хорошие примеры того, как его использовать?

E5KDAQ.vb

 Imports System.Runtime.InteropServices
Imports System.Threading
Imports System.text
Imports System.IO
Imports System.Environment
Module E5KDAQ

  'Public Cm As New MODULE_IOCHANNELS
  'TCP/IP Port Declaration
  Const TCP_MODBUS_PORT = 502                    'MODBUS/TCP
  Public Const UDP_ASC_PORT = 1025               'UDP ASCII Command
  Public Const UDP_ALARM_PORT = 5168             'UDP alarm port
  Public Const UDP_STREAM_PORT = 5148            'UDP stream port
  Public Const BROADCAST_IP = "255.255.255.255"


  '########## E5KDAQ.DLL Export Functions ###############################################//

  <DllImport("E5KDAQ.dll")> _
  Public Function E5K_GetRunTimeOS() As Integer
  End Function

  '----Open/Close module functions -----

  <DllImport("E5KDAQ.dll")> _
  Public Function E5K_OpenModuleUSB(ByVal devid As Integer) As Short
  End Function

  <DllImport("E5KDAQ.dll")> _
  Public Function E5K_GetLocalIP(ByRef ip0 As Byte,<[In](),Out()>Byref ip1 As Byte,<[In](),Out()> ByRef ip2 As Byte,<[In](),Out()>ByRef ip3 As Byte) As Short
  End Function
  <DllImport("E5KDAQ.dll")> _
  Public Function E5K_DebugPrint(ByVal str As String)
  End Function

End Module

Я пытался ссылаться на файл dll непосредственно в моем проекте C #, но не смог со следующей ошибкой:

enter image description here

Я также пытался скомпилировать проект VB как библиотеку классов со следующим:

Class1.vb

Imports System.Runtime.InteropServices
Imports System.Threading
Imports System.Text
Imports System.IO
Imports System.Environment
Public Class Class1
    'Public Cm As New MODULE_IOCHANNELS
    'TCP/IP Port Declaration
    Const TCP_MODBUS_PORT = 502                    'MODBUS/TCP
    Public Const UDP_ASC_PORT = 1025               'UDP ASCII Command
    Public Const UDP_ALARM_PORT = 5168             'UDP alarm port
    Public Const UDP_STREAM_PORT = 5148            'UDP stream port
    Public Const BROADCAST_IP = "255.255.255.255"
    'Type of Event
    Public Const ALARM_EVENT_TYPE = 0
    Public Const STREAM_EVENT_TYPE = 1

    Public Const HIGH_ALARM_EVENT = 0
    Public Const LOW_ALARM_EVENT = 1

    Public Const AD_ALARM_EVENT = 1
    Public Const DI_ALARM_EVENT = 0

  <DllImport("Kernel32.Dll")>
    Public Function CloseHandle(ByRef hObject As Integer) As Long
    End Function

    <DllImport("Kernel32.Dll")>
    Public Function CreateMutex(ByVal Attr As Integer, ByVal bInitial As Integer, ByVal lpName As Integer) As Integer
    End Function

    <DllImport("Kernel32.Dll")>
    Public Function ReleaseMutex(ByVal hdnl As Integer) As Boolean
    End Function

    Public Function GetVarPtr(ByVal e As Object) As Integer
        Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
        Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
        GC.Free()
        Return GC2
    End Function

    '########## E5KDAQ.DLL Export Functions ###############################################//

    <DllImport("E5KDAQ.dll")>
    Public Function E5K_GetRunTimeOS() As Integer
    End Function

    '----Open/Close module functions -----

    <DllImport("E5KDAQ.dll")>
    Public Function E5K_OpenModuleUSB(ByVal devid As Integer) As Short
    End Function

    <DllImport("E5KDAQ.dll")>
    Public Function E5K_OpenModuleIP(ByVal IP As String, ByVal ConnectTimeout As Integer, ByVal TxTimeout As Integer, ByVal rxTimeout As Integer) As Short
    End Function
End Class

Я получил следующую ошибку:

enter image description here

Итак, как мне импортировать E5KDAQ.dll, чтобы я мог успешно скомпилировать его как библиотеку классов для использования на C #?

Если кто-то захочет помочь, я могу выслать вам пример файла проекта vb, так как он доступен для общественности.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Решено. Чтобы включить динамически связанную библиотеку dll в файл библиотеки классов, вы должны использовать Shared Functione.g

Открытая общая функция COMM_Close (ByVal ComPortNumber As Short) As Short Конечная функция

https://docs.microsoft.com/en-us/dotnet/visual-basic/misc/bc31529

Также найди другое решение, попробовав это тоже. Преобразование всего vb.net в расширения csharp visual studio

Как преобразовать проект VB в проект C #

Ошибка при запуске библиотеки классов на c #. В проекте c # я вижу все функции, однако при сборке проекта я получил следующую ошибку:

enter image description here

enter image description here

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using E5KDAQCSHARP32;

namespace TestE5KDA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int dival=0;
            int[] counterval = new int[23];
            // Test test1= new Test();
            Class1.E5K_ReadDIStatus(Module1.mid, ref dival);

            //read DI counter value
            Class1.E5K_ReadMultiDICounter(Module1.mid, 0, 2, counterval);
    for (int  i = 0; i<= Module1.mDIChannels -1; i++)
            {
                //Module1. mDICounterlist(i).Text = counterval(i);
                //Console.WriteLine(i);
                MessageBox.Show(counterval[i].ToString());
            }




        }

    }
}

Также поместите dll в папку отладки, где создаются исполняемые файлы, все еще получая ту же ошибку:

enter image description here Есть идеи, что это?

0 голосов
/ 30 августа 2018

2-и-битные опции:

  1. (самый простой и, вероятно, предпочтительный), скомпилируйте вашу существующую оболочку VB как dll и просто ссылайтесь на эту dll из вашего проекта C # - и просто используйте var i = E5KDAQ.E5K_GetRunTimeOS(); и т. Д. Из вашего C #
  2. перевести (вручную или с помощью инструмента) VB в C #; если все, что VB делает, это объявляет цели P / Invoke, то это вероятно не очень сложно
  3. ("и немного") скомпилируйте вашу существующую оболочку VB как dll, затем используйте инструмент, подобный "рефлектору", чтобы переписать скомпилированный IL как C #
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...