如何使用VB.net中的dll实现C#

如何使用VB.net中的dll实现C#,c#,vb.net-2010,C#,Vb.net 2010,我有dll和使用VB.net的示例代码。 但是,我需要使用C#上的E5KDAQ.dll文件在E5KDAQ.vb中使用函数。我可以知道如何做到这一点吗 有人能举一些好的例子来说明如何使用它吗 E5KDAQ.vb Imports System.Runtime.InteropServices Imports System.Threading Imports System.text Imports System.IO Imports System.Environment Module E5KDAQ

我有
dll
和使用
VB.net的示例代码。
但是,我需要使用C#上的
E5KDAQ.dll
文件在
E5KDAQ.vb
中使用函数。我可以知道如何做到这一点吗

有人能举一些好的例子来说明如何使用它吗

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
导入System.Runtime.InteropServices
导入系统线程
导入System.text
导入System.IO
导入系统、环境
模块E5KDAQ
'公共Cm作为新模块\u IOU通道
'TCP/IP端口声明
常量TCP_MODBUS_端口=502'MODBUS/TCP
Public Const UDP_ASC_PORT=1025'UDP ASCII命令
公用常量UDP_报警_端口=5168'UDP报警端口
公用常量UDP_流_端口=5148'UDP流端口
公共常数广播\u IP=“255.255.255.255”
“#########E5KDAQ.DLL导出函数###############################################//
_
公共函数E5K_GetRunTimeOS()为整数
端函数
'----打开/关闭模块功能-----
_
公共函数E5K_OpenModuleUSB(ByVal Device为整数)为短
端函数
_
公共函数E5K_GetLocalIP(ByRef ip0为字节,ByRef ip1为字节,ByRef ip2为字节,ByRef ip3为字节)为短
端函数
_
公共函数E5K_DebugPrint(ByVal str作为字符串)
端函数
端模块
我试图在我的C#项目中直接引用dll文件,但由于以下错误而无法引用:

我还尝试将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
导入System.Runtime.InteropServices
导入系统线程
导入系统文本
导入System.IO
导入系统、环境
公共班级1
'公共Cm作为新模块\u IOU通道
'TCP/IP端口声明
常量TCP_MODBUS_端口=502'MODBUS/TCP
Public Const UDP_ASC_PORT=1025'UDP ASCII命令
公用常量UDP_报警_端口=5168'UDP报警端口
公用常量UDP_流_端口=5148'UDP流端口
公共常数广播\u IP=“255.255.255.255”
“事件类型”
公共常数报警事件类型=0
公共常量流事件类型=1
公共常数高报警事件=0
公共常数低报警事件=1
公共常数报警事件=1
公共常数报警事件=0
公共函数CloseHandle(ByRef hObject作为整数)的长度为
端函数
公共函数CreateMutex(ByVal Attr为整数,ByVal bInitial为整数,ByVal lpName为整数)为整数
端函数
公共函数将互斥(ByVal hdnl作为整数)释放为布尔值
端函数
公共函数GetVarPtr(ByVal e作为对象)作为整数
尺寸GC为GCHandle=GCHandle.Alloc(e,GCHandleType.pinted)
将GC2调整为整数=GC.addrofPindedObject.ToInt32
GC.Free()
返回GC2
端函数
“#########E5KDAQ.DLL导出函数###############################################//
公共函数E5K_GetRunTimeOS()为整数
端函数
'----打开/关闭模块功能-----
公共函数E5K_OpenModuleUSB(ByVal Device为整数)为短
端函数
公共函数E5K_OpenModuleIP(ByVal IP为字符串,ByVal ConnectTimeout为整数,ByVal TxTimeout为整数,ByVal RXTTimeout为整数)为短
端函数
末级
我得到了以下错误:

那么,如何导入E5KDAQ.dll,以便将其成功编译为C#使用的类库呢

如果有人愿意提供帮助,我可以向您发送示例vb项目文件,因为公众可以访问该文件

任何帮助都将不胜感激。

2-a-bit选项:

  • (最简单,也可能是首选)将现有的VB包装编译为dll,并从C#项目中引用该dll,只需使用
    var i=E5KDAQ.E5K_GetRunTimeOS()等从您的C#
  • (手动或通过工具)将VB翻译成C#;如果VB所做的只是公布P/Invoke目标,那么这可能不是很棘手
  • (和一位)将现有的VB包装编译为dll,然后使用“reflector”之类的工具将编译后的IL重写为C#
  • 决心。 要在类库文件中包含dll动态链接库,必须使用Shared函数e.g

    公共共享函数COMM_Close(ByVal ComPortNumber简称)简称 端函数

    也可以找到另一个解决方案来尝试一下。 将整个vb.net转换为csharp visual studio扩展

    在c#上运行类库时出错。 在c#项目中,我可以看到所有的功能,但是当我构建项目时,我得到了以下错误:

    表格1.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());
                }
    
    
    
    
            }
    
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用系统组件模型;
    使用系统数据;
    使用系统图;
    使用System.Linq;
    使用系统文本;
    使用System.Threading.Tasks;
    使用System.Windows.Forms;
    使用E5kDAQCS32;
    名称空间5KDA
    {
    公共部分类Form1:Form
    {
    公共表格1()
    {
    初始化组件();
    }
    私有void Form1\u加载(对象发送方、事件参数e)
    {
    int dival=0;
    int[]counterval=新int[23];
    //test1=新测试();
    类别1.E5K_读写器(模块1.mid,参考分区);
    //读取DI计数器值
    类1.E5K_读取多数据计数器(模块1.mid、0、2、计数器值);
    
    对于(int i=0;任何与.NET兼容的语言编程的要点是,无论使用哪种语言,您都可以从同样由.NET生成的所有其他程序集中引用已编译的程序集。因此,您可以在VB.NET上编写的程序集中引用使用C#编写的程序集,反之亦然。只需添加对项目/程序集的引用。这是新错误吗:那么,它必须是非实例;在C语言中,它被称为
    static
    ——在VB中,它是ca