扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1、DLL文件放到程序的 bin\Debug文件夹下
创新互联于2013年成立,是专业互联网技术服务公司,拥有项目网站建设、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元鼓楼做网站,已为上家服务,为鼓楼各地企业和个人服务,联系电话:18982081108
2、接DLL接口说明定义DLL要使用的函数或过程。
如: Runtime.InteropServices.DllImport("DllTest.dll") _
Shared Sub sendTo(ByVal x As String)
End Sub
3、直接调用sendto()即可
两个项目的依赖关系重新设置一下,然后那个C的项目重新生成一下试试
当你用LoadLibrary加载你的DLL,或第一次调用你的DLL中的函数时,DLLMAIN才会被执行,不是一开始就执行DLLMAIN的
用 COM 当然可以。不过,COM 封装比较复杂,不太熟悉的话,出错调试很麻烦。而且要求的知识面较宽。
简单的封装可以这样实现:
1)通过 VS 创建一个 CLR 类库项目,在其中可以简单封装标准的 DLL 导出函数,当然,这些导出函数实际上是不导出。然后定义一个 .net 类,在这个类中定义对应所有导出函数的公共方法,然后在公共方法内部调用这些标准的 C++ 函数。生成这个 CLR DLL。
2)在VB中,可以引入这个 CLR DLL,然后 VB 就可以通过调用 CLR DLL 中定义的 .net 类来间接调用原来标准的 C++ DLL 导出函数了。
当然,因为在.net 中,所有的实现都是通过类来封装的,强调的是面向对象的编程理念。因此,可以将 C++ DLL 本来的导出函数封装成类。然后实例化一个全局 C++ 类,在后续定义的.net 类中,定义相关的公共方法,私有方法,在内部对这个全局的 C++ 类进行操作(这一切都是在同一个.cpp文件中就可以完成的,利用 cl 编译器的混编特性进行编译)。在客户程序,唯一要做的就是调用公共方法就 OK 了。
以下提供示例,楼主可以参考一下:
// CLR 类库项目。
// NestedCppClassDll.cpp
///////////////////////////////
// 非托管代码。
#pragma unmanaged
#pragma once
#include stdio.h
#include windows.h
class NestedCppClass {
public:
void PrintInfo() {
printf("NestedCppClass\r\n");
}
int Func(int i) {
return ++i;
}
};
NestedCppClass g_ncc;
#pragma managed
///////////////////////////////
///////////////////////////////
// 托管代码。
using namespace System;
namespace NestedCppClassDll {
public ref class OutClrClass
{
public:
void PrintInfo() {
Console::WriteLine("OutClrClass");
g_ncc.PrintInfo();
}
int Func(int i) {
return g_ncc.Func(i);
}
};
}
///////////////////////////////
'VB控制台项目。
'项目需要引入CLR DLL
'Module1.vb
Module Module1
Sub Main()
Dim c As NestedCppClassDll.OutClrClass
c = New NestedCppClassDll.OutClrClass
c.PrintInfo()
System.Console.WriteLine(c.Func(1))
End Sub
End Module
'控制台输出内容:
'OutClrClass
'NestedCppClass
'2
// C#控制台项目。
// 项目需要引入 CLR DLL。
// Program.cs
///////////////////////////////
using System;
using NestedCppClassDll;
namespace NestedCppClassApp
{
class Program
{
static void Main(string[] args)
{
OutClrClass c = new OutClrClass();
c.PrintInfo();
Console.Write(c.Func(1));
}
}
}
//控制台输出内容:
//OutClrClass
//NestedCppClass
//2
DLL是不是你自己在创建,如果不是下面的格式就没有办法调用了(需要生成的是ActiveX 控件)
extern "C" _declspec(dllexport) int _stdcall treble(int* x,int len)
{
for(int i=0;ilen;i++)
x[i]=i;
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流