在vs2017怎么编写java,编写了一个C#程序,这个程序调用了一个vb编写的dll,生成后在别的电脑上异常

     在项目过程中有时候你需要调鼡非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用本篇文章将引导你快速理解这个调用的过程。

2. 创建一个C++的动态库项目:

3. 在应用程序设置中选择“DLL”,其他按照默认选项:

最后点击完成得到如图所示项目:

我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序的入口点它的作用跟exe文件有个main或者WinMain入口函数是一样的,它就是作为DLL的一个入口函数实际上它是个可选的文件。它是在静态链接时或动态链接时调用LoadLibrary和FreeLibrary时都会被调用详细内容可以参考()。

现在我们加入以下内容:

      extern "C" 包含双重含义从字面上即可得到:首先,被它修饰的目标是“extern”的;其次被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C語言方式编译和连接的

我们用反编译工具PE Explorer查看下该DLL里面的方法:

可以发现对外的公共函数上包含这四种“加减乘除”方法。

6. 现在来演示丅如何利用C#项目来调用非托管C++的DLL首先创建C#控制台应用程序:

8. 另外,记得把CPPDemo中生成的DLL文件拷贝到CSharpDemo的bin目录下你也可以通过设置【项目属性】->【配置属性】->【常规】中的输出目录:

这样编译项目后,生成的文件就自动输出到CSharpDemo中了

9. 然后在Main入口编写测试代码:

10. 以上的方法只能通過静态方法对于C++中的函数进行调用。那么怎样通过静态方法去调用C++中一个类对象中的方法呢现在我在CPPDemo项目中添加一个头文件userinfo.h:

这里声明┅个结构,包括name和age这个结构是用于和C#方面的结构作个映射。

注意:代码中的User*是个指针返回也是一个对象指针,这样做为了防止方法作鼡域结束后的局部变量的释放

其中这里的结构User就和C++中的User对应。

注意:红色字体部分这里结构指针首先转换成IntPtr句柄,然后通过Marshal.PtrToStructrue转换成你所需要的结构

最后附上我的源代码:,希望对大家有所帮助:)

我要回帖

更多关于 vs2017怎么编写java 的文章

 

随机推荐