当前位置:编程学习 > C#/ASP.NET >>

我如何在c#或者vb.net里面调用C的函数

本人主要是用vb.net,但是有几个算法是别人用C写的,我怎样才能调用呢?
举个例子,我有一个C里面的函数,名字叫做AAA
我在我的vb.net的解决方案里面新增了一个VC的类库项目,名字叫做VCDLL
项目里面自动给我生成一个头文件,叫做VCDLL.H
里面有一个Class1
接下来我在Class1里面写这个函数
namespace VCDLL {
    public ref class Class1
      {
public :int AAA()
  {return 123;}
       };
}

编译通过了以后,我在VB.NET的项目里面引用了这个项目,
现在的问题是,我可以看到VCDLL.Class1,但是看不到函数AAA,这个是什么原因呢?
        Dim wsDll As New VCDLL.Class1    '这条语句是没问题的,
        Dim i as integer        
        i=wsDll.AAA                      '这条语句就出问题了,看不到AAA这个函数

我VC基本上一窍不通,只是需要简单的调用几个C里面的函数,我这样做有什么问题吗?

--------------------编程问答-------------------- lz,搜一下“c#调用标准dll” --------------------编程问答-------------------- 我的主要问题不是如何调用,而是如何制作这个DLL,我想我的调用应该是没什么问题,但是制作的DLL应该是有什么问题吧?
--------------------编程问答-------------------- 用C写成标准的dll再进行调用,在C#窗体中直接加载就行。。 --------------------编程问答-------------------- 就是不知道怎么写成标准的DLL,能说的稍微详细一点吗?
我帖子里面贴的代码有什么问题吗?调用的时候为什么看不到类里面的函数?

--------------------编程问答-------------------- 是不是我vc里面函数的声明有问题呢? --------------------编程问答-------------------- 最好是用C写的dll,然后动态加载。 --------------------编程问答-------------------- 我的问题就是我写的有问题吗?问题在哪里?
能说的详细一点吗?

--------------------编程问答-------------------- 我照楼主的程序写了一下没出现那样的问题啊,调用很正常 --------------------编程问答-------------------- 我又重新试了一下,我举的这个例子确实没问题,但是我实际应用的函数需要传递一个数组类型的参数,也就是这样的


public :int AAA(double i[])
{return 123;}
 


带了一个数组参数就不行了,是不是我这个数组的参数的定义方式不对呢?
--------------------编程问答-------------------- 以前用C写的一个串口通讯的dll其中的一部分。这个也是写给人家用VB程序调用的。
定义:
#ifndef _WINDOWS_
#include <afxwin.h>
#endif

#ifndef ZIGCOMDLL_H
#define ZIGCOMDLL_H

#ifdef ZIGCOMDLL_F
#define ZIGCOMDLL_FUNC _declspec(dllexport) //导出函数
#else
#define ZIGCOMDLL_FUNC _declspec(dllimport) //导入函数
#endif


#ifdef __cplusplus
extern "C" {
#endif//
ZIGCOMDLL_FUNC void* __stdcall CreateZigComDllClass();
ZIGCOMDLL_FUNC void __stdcall DestroyZigComDllClass(void* objptr);
ZIGCOMDLL_FUNC int __stdcall ZigCom_OpenConnection(void* objptr, int comport, int baud, int databits, int parity, int stopbits);
ZIGCOMDLL_FUNC int __stdcall ZigCom_CloseConnection(void* objptr);
ZIGCOMDLL_FUNC DWORD __stdcall ZigCom_ReadComm(void* objptr, BYTE* buf, DWORD dwLength);
ZIGCOMDLL_FUNC DWORD __stdcall ZigCom_WriteComm(void* objptr, BYTE* buf, DWORD dwLength);
ZIGCOMDLL_FUNC DWORD __stdcall ZigCom_SendPackage(void* objptr, BYTE* buf, DWORD dwLength);
。。。。。。。。。。。
#ifdef __cplusplus
}
#endif//

#endif


源文件部分:
DWORD __stdcall ZigCom_SendPackage(void* objptr, BYTE* buf, DWORD dwLength)
{
cZigComDll *cZCD_ptr = (cZigComDll *) objptr;

if (cZCD_ptr)
return cZCD_ptr->SendPackage(buf, dwLength);
else
return -1;
}
--------------------编程问答-------------------- 这个也是有用了数组类型参数的 --------------------编程问答-------------------- 最好做一个C++/CLI类库包装一下c++ dll,在C#中引入这个包装程序集。 --------------------编程问答-------------------- 算法很复杂么?
为什么不转化为你想要的语言! --------------------编程问答--------------------
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,