C-Sharp调用标准动态库

 

  软件环境: VC6.0(当然其他版本的VC5也可以)


   1.打造 标准动态库
  __declspec(dllexp ort) int __cdecl add(int, int);//这一句是声明动态库输出一个可供外不调用的函数原型.
  int add(int a,int b) {//实现这个函数
  return a+b;
  }

    以上基本 3行代码,声明一个add的要领 , 输入参数是两个int参数,返回这两个数之和. 保存为MyLib.c
  然后执行编译命令.
  H:/XSchool/C#-School/HowTo>cl /LD MyLib.c
  Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
  Copyright (C) Microsoft Corp 1984-1998. www.devdao.com All rights reserved.

  MyLib.c
  Microsoft (R) Incremental Linker Version 6.00.8447
  Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

  /out:MyLib.dll
  /dll
  /implib:MyLib.lib
  MyLib.obj
  Creating library MyLib.lib and object MyLib.exp

  确信有以上输出, 说明编译成功生成了动态库.

 

 

  2.编写C-Sharp程序调用该动态库
  using System;
  using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包

  public class InvokeDll {
   [DllImport("MyLib.dll", CharSet=CharSet.Auto)]
   static extern int add(int a,int b);//声明外部的标准动态库, 跟Win32API是一样的.

   public static void Main() {
    Console.WriteLine(add(10,30));
    }
  }

  保存为InvokeDll.cs文件, 与MyLib.dll置于同一目录, 编译该文件.
  H:/XSchool/C#-School/HowTo>csc invokedll.cs
  将生成Invokedll.exe, 可以执行该文件.

 

 

 

 

 

另付:

C#调用C函数的方法:
 
方法一:
 
1.新建Visual C++类型的Win32项目
C语言的函数定义如下:
extern "C" __declspec(dllexport) int fnTestWin32(void);
实现如下
extern "C" __declspec(dllexport) int fnTestWin32(void)
{
 return 42;
}
工程属性页[常规]->[配置类型]选择[动态库.dll]
会生成.lib和.dll文件。用Dependency工具能看到fnTestWin32函数,因为使用了extern "C"
 
2.C#工程中
        [DllImport("TestWin32.dll", EntryPoint = "fnTestWin32", CharSet = CharSet.Ansi)]
        private static extern int fnTestWin32();
把Win32项目生成的dll拷贝到C#生成的exe文件,就可以调用了。
 
 
方法二:
 
1.新建Win32工程
直接使用C语言,函数定义不使用extern "C" __declspec(dllexport)
工程属性页[常规]->[配置类型]选择[静态库(.lib)]
 
2.新建Visual C++ CLR 类库工程
这里面写的是C++的类,提供给C#直接调用的,作为C与C#的中转,主要使用Marshal类
应用上面的Win32工程,并包含头文件
extern "C"
{
#include "app_notify.h"
}
 
3.C#工程中直接使用CLR类库工程生成的dll
### 回答1: C#是一种广泛使用的编程语言,也可以与C代码进行交互。调用C代码可以实现更高级的功能和操作。下面以一些示例代码来说明如何在C#调用C代码: 首先,我们需要创建一个包含C代码的动态链接库(DLL)文件。C代码使用一种称为P/Invoke的技术来与C#进行交互。我们可以使用C语言编写我们的函数,并确保它们通过将它们标记为导出函数可供C#访问。 一旦我们有了动态链接库文件,我们就可以在C#中进行调用。我们需要在C#代码中使用DllImport属性来指定具体的DLL文件和函数。 以下是一个示例,演示如何调用C代码中的add函数: ```c // C代码 // 将以下代码保存为一个名为c_code.c的文件 __declspec(dllexport) int add(int a, int b) { return a + b; } ``` ```csharp // C#代码 // 将以下代码保存为一个名为Program.cs的文件 using System; using System.Runtime.InteropServices; class Program { [DllImport("c_code.dll")] public static extern int add(int a, int b); static void Main() { int result = add(2, 3); Console.WriteLine("The result is: " + result); } } ``` 在上述示例中,C代码文件c_code.c包含了一个add函数,它将两个整数相加并返回结果。然后,在C#代码中,我们使用DllImport属性标记了add函数,并指定了C代码的DLL文件名。在Main函数中,我们调用了add函数,并将结果打印到控制台。 通过这种方法,我们可以在C#调用C代码并使用C代码中定义的函数来实现更高级的功能和操作。 ### 回答2: 在C#调用C代码的过程如下: 首先,需要将C代码编译为动态链接库(DLL)或共享库(SO)。这可以通过使用C语言的编译器将C代码编译为与目标平台相关的库文件来完成。 在C#中,可以使用Platform Invoke(P/Invoke)机制来调用C代码。P/Invoke是一种允许.NET程序与非托管代码进行交互的技术。 在C#调用C代码需要使用[System.Runtime.InteropServices.DllImport]属性来指定C函数的名称和库文件的路径。例如,如果C函数的名称是"myFunction",并且库文件的路径是"path/to/myLibrary.dll",则可以使用以下方式调用C函数: ```csharp using System.Runtime.InteropServices; class Program { [DllImport("path/to/myLibrary.dll")] public static extern void myFunction(); static void Main(string[] args) { myFunction(); } } ``` 在C#中定义的C函数必须与C代码中的函数签名一致,并且使用正确的数据类型。如果C函数返回某个类型的值,则可以在C#中将其定义为返回相应类型的extern函数。 需要注意的是,当在C#调用C代码时,需要确保目标平台的运行时环境已经安装了C代码所需的依赖项。否则,可能会引发运行时错误。 在使用P/Invoke调用C代码时,还需要注意数据类型的匹配,例如将C#的字符串转换为C中的char数组等。 总的来说,通过使用P/Invoke机制,可以很方便地在C#调用C代码,并实现C#与C之间的无缝交互。 ### 回答3: C#是一种面向对象的编程语言,而C是一种过程式的编程语言。虽然两者之间存在一些差异,但是C#是可以调用C代码的。 要在C#调用C代码,我们首先需要用到一个叫做Platform Invoke(简称P/Invoke)的机制。P/Invoke是一个能够在C#调用非托管代码(如C代码)的功能。它通过使用DllImport特性来告诉C#需要调用的C函数的名称、所在的库等信息。 下面是一个简单的示例,展示了如何在C#调用一个C函数: 首先,在C文件中,我们有一个名为myCFunction的函数: ``` #include <stdio.h> void myCFunction() { printf("Hello from C!"); } ``` 接下来,在C#中,我们需要使用DllImport特性来告诉编译器要调用的C函数的信息: ``` using System; using System.Runtime.InteropServices; class Program { [DllImport("myCLibrary.dll")] public static extern void myCFunction(); static void Main(string[] args) { myCFunction(); // 调用C函数 } } ``` 在这个示例中,我们使用了DllImport特性来指定要调用的C函数的库文件,函数名称等信息。然后,在C#中,我们可以直接调用这个C函数。 通过这种方式,我们可以在C#调用任意的C函数,实现更灵活的编程。当然,在使用P/Invoke时需要遵守一定的规则和注意事项,如确保C函数的参数和返回值类型与C#中的类型匹配,避免出现类型转换错误等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值