在VC.NET中调用VB.NET或C#生成的DLL类库

vb-net 专栏收录该内容
19 篇文章 0 订阅

在C++中,想要调用其它语言编写的DLL动态库,原先通常的做法是基于COM组件(Component Object Module)技术编译ActiveX DLL动态链接库,注册(Regsvr32)之后即可在C++中调用。

到了DOTNET环境中,上述方法依然有效,因为VC.NET依然支持非托管DLL文件,但是VB.NET/C#编写的DLL类库属于托管代码,就不能用非托管方式调用了。当然,VB.NET或C#编写的.NET类库依然可以生成COM类库,但是既然同属于Visual Studio .NET的一员,都以公共语言运行时(CLR:Common Language Runtime)为核心基础,为什么要放弃这个优势呢?

下面说一说如何在VC.NET中调用VB.NET或C#生成的托管DLL类库,这个类库封装了命名管道(Named Pipe)连接,用于本机或局域网内两个进程之间的通讯,类库中包含三个类:ClientInfo、NamedPipeClient和NamedPipeServer,ClientInfo类用于定义一个公共结构体,用于数据传输,NamedPipeClient类封装了命名管道客户端的操作,NamedPipeServer类封装了命名管道服务端的操作,服务端依然是VB.NET编写的,引用这个类库即可,非常简单,而客户端由C++程序员编写,需要引用VB.NET的类库,当然,VC.NET和VB.NET是同一版本(VS2010)。

VB.NET Codes(ClientInfo.vb):

Imports System.Runtime.InteropServices

Public Class ClientInfo
    <StructLayoutAttribute(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
    Public Structure ClientInfoStruct  '定义结构体
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=18)> _
        Dim Head As String  '结构体标志字符串
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=40)> _
        Dim ServerName As String '服务名称
        '代码省略..............
    End Structure
    '代码省略..............
End Class

VB.NET Codes(NamedPipeClient.vb):

Imports System.IO.Pipes
Imports System.Threading
Imports NamedPipeCommunication

Public Class NamedPipeClient
    Private PI As ClientInfo.ClientInfoStruct
    Public Sub New(ByVal newPorcessInfo As ClientInfo.ClientInfoStruct)
        PI = newPorcessInfo
    End Sub

    Public Sub New()
    End Sub

    Private MyPipeThread As Thread = Nothing  '定义线程
    Public Sub StartWork()  '开始工作
        MyPipeThread = New Thread(AddressOf connect) '打开一个后台线程
        MyPipeThread.IsBackground = True
        MyPipeThread.Start()
    End Sub

    Public Sub connect()  '线程主体
        '代码省略..............
    End Sub

    Public WriteOnly Property SetStatus() As Integer  '设置错误码
        Set(ByVal value As Integer)
            PI.ErrCode = value
        End Set
    End Property

    Public Sub Close()  '关闭连接,终止线程
        '代码省略..............
    End Sub
End Class

调用托管DLL文件的方法:在Dotnet环境通过 “添加引用” 的方式,直接把托管DLL文件添加到项目中。然后通过 Using DLL引用其命名空间,用New来实例化其中的类,来调用相应的DLL对象,另外要注意,确保项目属性默认支持CLR。为了简化代码,这里的例子用了CLR控制台模板。

这里写图片描述
这里写图片描述

VC.NET Codes(CDemo.cpp):

// CDemo.cpp: 主项目文件。

#include "stdafx.h"

using namespace System;
using namespace NamedPipeCommunication;

int main(array<System::String ^> ^args)
{
    ClientInfo::ClientInfoStruct p;  //创建结构体的实例
    p.ServerName = "Media Information Exchange Server";  //结构体赋值
    p.ServerType = "媒体交换服务器";
    p.strCmd = "Status";
    p.ErrCode = 0;
    NamedPipeClient ^MyPipe = gcnew NamedPipeClient(p);  //创建类的新实例
    MyPipe->StartWork();  //线程开始工作
    Console::WriteLine(L"Press enter key to send error code: 99");
    Console::ReadLine();
    MyPipe->SetStatus = 99;  //设置错误码
    Console::WriteLine(L"Press enter key to exit...");
    Console::ReadLine();
    MyPipe->Close();  //关闭线程
    return 0;
}

运行之后可以看到,与服务端连接正常。

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值