C#中调用VC编写的dll库

如何在C#中调用DLL(C/C++写的)。举一个我做过的例子说明:

    建立VC工程DllDemo,建立的时候选择MFC AppWizard(dll),选择Regular Dll using shared MFC Dll或者MFC Extension Dll。

    现在可以写一个函数代码,在DllDemo.cpp文件中添加这些代码。也可以使用新的文件添加代码;

 
 
  1. extern “C“ __declspec(dllexport) int Add(int a,int b)  
  2. {  
  3.      AFX_MANAGE_STATE(AfxGetStaticModuleState());  
  4.      TRACE("Entering DllAdd\n");  
  5.  
  6.      return a+b;  
  7. }  

    编译工程。

    下面建立一个C#的WinForm程序测试DllDemo:

    启动vs.net IDE,建立新的C#工程,选择WinForm应用程序。

    在Form1.cs中添加引用:using System.Runtime.InteropServices;

    在pulic class Form1声明的开头添加代码:

 
 
  1. [DllImport("MotorControlDll.dll",EntryPoint="Add",
  2. ExactSpelling=false,CallingConvention=CallingConvention.Cdecl)]  
  3. public static extern int Add(int a,int b); 

    至于DllImport属性的用法可以察看MSDN,对于各项参数有详细的说明。

    最后还要记得将DllDemo生成的位于Debug文件中DllDemo.dll文件加入到C#的WinForm程序的bin目录下。

    这样就可以直接使用Add(int a,int b)函数。

    这样,就完成了C#中调用dll库。

 

//---------------------------------------------------

c#控制台程序:

 

1. C++ 部分:

// TestDll.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"

extern "C" __declspec(dllexport) int GetReport(int id, char* retPath) 
{ 
	strcpy_s(retPath,1,""); 
	return -1; 
}

2. C# 部分, Console项目。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {      
        [DllImportAttribute("TestDll.dll", EntryPoint = "GetReport", 
            CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public unsafe static extern int GetReport(int id, 
            [MarshalAsAttribute(UnmanagedType.LPStr)]  System.Text.StringBuilder retPath);
        static void Main(string[] args)
        {
            int x = Program.GetReport(3, new StringBuilder("askask"));
            Console.WriteLine(x.ToString());
        }
    }
}

运行C#项目后,得到正确的返回值 -1.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值