【问题标题】:How to use dll for VB.net to C#如何将 dll 用于 VB.net 到 C#
【发布时间】:2019-02-05 04:49:15
【问题描述】:

我有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

我尝试在我的 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

我收到以下错误:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 使用任何 .NET 兼容语言进行编程的要点是,无论 哪个,您都可以从 每个 也生成的其他程序集引用已编译的程序集通过.NET。因此,您可以在 VB.NET 上引用使用 C# 编写的程序集,反之亦然。只需添加对您的项目/程序集的引用即可。
  • 重新出现新错误:必须是非实例,那么;在 C# 中称为 static - 在 VB 中称为 Shared。所以:将这些方法标记为Shared

标签: c# vb.net-2010


【解决方案1】:

已解决。 要在您的类库文件中包含 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 扩展

How Convert VB Project to C# Project

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

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放在创建可执行文件的debug文件夹中,还是报同样的错误:

知道这是什么吗?

【讨论】:

  • 发生另一个问题。当我尝试在 c# 中应用它时,我收到一个错误,它无法加载 DLL E5KDAQ.dll。我认为这个 dll 在编译到类库时包含在 vb 本身中?添加在我的回答中
  • “我认为这个 dll 包含在 vb 本身中” - 不,这些是外部导入 - 你仍然需要运送实际的 dll。它需要在 execution 位置结束,通常是 bin/debugbin/release 进行测试。通常你会在项目中包含 dll 并告诉构建系统将其复制到输出位置。
  • 我已经将 dll 包含在输出调试目录中,但仍然出现相同的错误
【解决方案2】:

2-and-a-bit 选项:

  1. (最简单且可能是首选)将现有的 VB 包装器编译为 dll,然后从 C# 项目中简单地引用该 dll - 并在 C# 中使用 var i = E5KDAQ.E5K_GetRunTimeOS();
  2. (手动或通过工具)将 VB 翻译成 C#;如果 VB 所做的只是宣传 P/Invoke 目标,那么这可能并不是很棘手
  3. (“和一点”)将现有的 VB 包装器编译为 dll,然后使用“反射器”之类的工具将编译后的 IL 重写为 C#

【讨论】:

  • 您能解释一下您所说的 VB 包装器是什么意思吗?您的意思是 E5KDAQ.vb 文件吗?您的意思是我创建了一个包含 E5KDAQ.vb 和 E5KDAQ.dll 的 VB 项目并编译它。对不起我是 vb.net 和 c# 的新手
  • @ThomasKoh .NET 程序集的基本部署单元是 dll;当您编译 VB 或 C# 项目时,输出通常是一个 dll(除非您告诉它创建一个可执行文件)。 other 项目可以引用该 dll。注意:如果它们在同一个 Visual Studio 解决方案中,即使这样也太过分了 - 您可以将 C# 项目中的“项目引用”添加到 VB 项目中,它会自动管理详细信息(dll、nupkgs 等) .您不能在 C# 项目中使用 VB 文件,但您可以在同一个解决方案中拥有一个 VB 项目和一个 C# 项目,并在它们之间进行通信。
  • 我尝试在我的 C# 项目中直接添加对 dll 文件的引用,但出现以下错误。已根据我的问题对其进行了更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多