如何在C#中调用C程序

时间:2022-08-30 17:46:48
1.我用C#调用一个C程序,是不是直接将C程序生成的dll文件复制到bin文件夹下就可以了?
2.将C#中的值传给dll中的一个变量,如何赋值?

14 个解决方案

#1


添加对dll的引用

#2


(1)也可以是系统目录、程序目录、根目录或者程序中指定的目录。
(2)函数传参数。

#3


引用 1 楼  的回复:
添加对dll的引用

C不是不用引用吗?

#4


本帖最后由 caozhy 于 2012-10-15 12:35:17 编辑
那个人的回答你可以忽略了。

#5


引用 4 楼  的回复:
那个人的回答你可以忽略了。

- -何必呢.... 我有说错什么么,添加引用后该DLL公开的所有方法函数变量不是都能直接看到了么....

#6


引用 5 楼  的回复:
引用 4 楼  的回复:
那个人的回答你可以忽略了。

- -何必呢.... 我有说错什么么,添加引用后该DLL公开的所有方法函数变量不是都能直接看到了么....


你说得也没错
只是楼主没说没明白而已

如何在C#中调用C程序

#7


引用 2 楼  的回复:
(1)也可以是系统目录、程序目录、根目录或者程序中指定的目录。
(2)函数传参数。

函数传参数,用不用声明方法?比如C#中的变量A赋值给dll中的B方法中的变量C,是应该A=B.C还是
public static extern int 方法  A=B这样?

#8


把函数的声明、定义和调用分清楚。

[dllimport(...)]
public static extern int 方法b(int 参数);
这个是声明
因为函数是在dll中实现的,所以不需要定义。

调用
int result = 方法b(a); //这里的a是实参

在C语言的dll中:
int 方法b(int c) //这里的c是形参
{
    ...
}

另外5l说的是托管的dll,这里说的是非托管的dll。

#9


引用 8 楼  的回复:
把函数的声明、定义和调用分清楚。

[dllimport(...)]
public static extern int 方法b(int 参数);
这个是声明
因为函数是在dll中实现的,所以不需要定义。

调用
int result = 方法b(a); //这里的a是实参

在C语言的dll中:
int 方法b(int c) //这里的c是形参
{
    ...
}……




曹版主已经回答得很详细了,本人再画蛇添足一回.

关于C#调用C函数,本人有两个小例子:

《[科普小短文]在C#中调用C语言函数》
http://blog.csdn.net/xinyaping/article/details/7288325

这是在Windows平台下C#调用C的DLL的例子;

《[科普小短文]在C#中调用C语言函数 (Linux & Mono版)》
http://blog.csdn.net/xinyaping/article/details/7672171

这是在Linux平台下C#调用C的DLL的例子。


另外,如果不拘泥于DLL(或者Linux下的.so),直接用C#调用C/C++的函数也是可以的,在Windows平台下的方法是借助C++/CLI。在Linux平台下有一个与之相对应(也非常类似、用法相同)的解决方案,那就是 CXXI。

这些仅仅作为一些补充,稍微开阔一下视野应该没坏处。 如何在C#中调用C程序

#10


辛老大,挑战一下难度嘛,把题目修改一下:
用C实现各种DLL,并且用C#调用之:
各种DLL包括:COM DLL,WebService DLL,Win32 API DLL

如何在C#中调用C程序

#11


引用 10 楼  的回复:
辛老大,挑战一下难度嘛,把题目修改一下:
用C实现各种DLL,并且用C#调用之:
各种DLL包括:COM DLL,WebService DLL,Win32 API DLL


好吧,有空了我写写Demo吧。不过说实话,第一,现在业余时间越来越少,用来写博客的时间也非常少;第二,就算我不来写这个Demo,你所提的这些,网上一搜都能搜到。

#12


對含有類的C++Dll 是沒辦法導出的吧 MS只能用不在類裏面的方法等。

如果可以導出類 求Demo

#13


引用 12 楼  的回复:
對含有類的C++Dll 是沒辦法導出的吧 MS只能用不在類裏面的方法等。

如果可以導出類 求Demo


你的目的无非就是想要直接用DLL里面的C++ class嘛。

不导出,直接用,可以吗?只不过在这里不能光用C#了,要借助Managed C++了。
反正Managed C++也是.Net的范围。

创建一个Managed C++ class来提供Native C++ class和C#之间的接口。仅仅是个接口而已,执行的时候真正调用的还是Native C++ class.


#14


小弟刚学C#不久,有好多的东西不是太清楚,让各种见笑了,看了上面各种大大的回复,有些明白问题了,目前正在编程中,如果遇到什么问题再问,先把分给各种加了,谢谢。

#1


添加对dll的引用

#2


(1)也可以是系统目录、程序目录、根目录或者程序中指定的目录。
(2)函数传参数。

#3


引用 1 楼  的回复:
添加对dll的引用

C不是不用引用吗?

#4


本帖最后由 caozhy 于 2012-10-15 12:35:17 编辑
那个人的回答你可以忽略了。

#5


引用 4 楼  的回复:
那个人的回答你可以忽略了。

- -何必呢.... 我有说错什么么,添加引用后该DLL公开的所有方法函数变量不是都能直接看到了么....

#6


引用 5 楼  的回复:
引用 4 楼  的回复:
那个人的回答你可以忽略了。

- -何必呢.... 我有说错什么么,添加引用后该DLL公开的所有方法函数变量不是都能直接看到了么....


你说得也没错
只是楼主没说没明白而已

如何在C#中调用C程序

#7


引用 2 楼  的回复:
(1)也可以是系统目录、程序目录、根目录或者程序中指定的目录。
(2)函数传参数。

函数传参数,用不用声明方法?比如C#中的变量A赋值给dll中的B方法中的变量C,是应该A=B.C还是
public static extern int 方法  A=B这样?

#8


把函数的声明、定义和调用分清楚。

[dllimport(...)]
public static extern int 方法b(int 参数);
这个是声明
因为函数是在dll中实现的,所以不需要定义。

调用
int result = 方法b(a); //这里的a是实参

在C语言的dll中:
int 方法b(int c) //这里的c是形参
{
    ...
}

另外5l说的是托管的dll,这里说的是非托管的dll。

#9


引用 8 楼  的回复:
把函数的声明、定义和调用分清楚。

[dllimport(...)]
public static extern int 方法b(int 参数);
这个是声明
因为函数是在dll中实现的,所以不需要定义。

调用
int result = 方法b(a); //这里的a是实参

在C语言的dll中:
int 方法b(int c) //这里的c是形参
{
    ...
}……




曹版主已经回答得很详细了,本人再画蛇添足一回.

关于C#调用C函数,本人有两个小例子:

《[科普小短文]在C#中调用C语言函数》
http://blog.csdn.net/xinyaping/article/details/7288325

这是在Windows平台下C#调用C的DLL的例子;

《[科普小短文]在C#中调用C语言函数 (Linux & Mono版)》
http://blog.csdn.net/xinyaping/article/details/7672171

这是在Linux平台下C#调用C的DLL的例子。


另外,如果不拘泥于DLL(或者Linux下的.so),直接用C#调用C/C++的函数也是可以的,在Windows平台下的方法是借助C++/CLI。在Linux平台下有一个与之相对应(也非常类似、用法相同)的解决方案,那就是 CXXI。

这些仅仅作为一些补充,稍微开阔一下视野应该没坏处。 如何在C#中调用C程序

#10


辛老大,挑战一下难度嘛,把题目修改一下:
用C实现各种DLL,并且用C#调用之:
各种DLL包括:COM DLL,WebService DLL,Win32 API DLL

如何在C#中调用C程序

#11


引用 10 楼  的回复:
辛老大,挑战一下难度嘛,把题目修改一下:
用C实现各种DLL,并且用C#调用之:
各种DLL包括:COM DLL,WebService DLL,Win32 API DLL


好吧,有空了我写写Demo吧。不过说实话,第一,现在业余时间越来越少,用来写博客的时间也非常少;第二,就算我不来写这个Demo,你所提的这些,网上一搜都能搜到。

#12


對含有類的C++Dll 是沒辦法導出的吧 MS只能用不在類裏面的方法等。

如果可以導出類 求Demo

#13


引用 12 楼  的回复:
對含有類的C++Dll 是沒辦法導出的吧 MS只能用不在類裏面的方法等。

如果可以導出類 求Demo


你的目的无非就是想要直接用DLL里面的C++ class嘛。

不导出,直接用,可以吗?只不过在这里不能光用C#了,要借助Managed C++了。
反正Managed C++也是.Net的范围。

创建一个Managed C++ class来提供Native C++ class和C#之间的接口。仅仅是个接口而已,执行的时候真正调用的还是Native C++ class.


#14


小弟刚学C#不久,有好多的东西不是太清楚,让各种见笑了,看了上面各种大大的回复,有些明白问题了,目前正在编程中,如果遇到什么问题再问,先把分给各种加了,谢谢。