c#怎样调用 vc++的dll呢?

wis2007 2009-01-15 04:38:26
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication3
{
class Program
{

[DllImport("D:\\DIPS3.0\\Info\\Bin\\Search.Dll", EntryPoint = "Init", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern uint Init();

static void Main(string[] args)
{
try
{
uint result = Init();
Console.WriteLine(result);
Console.Read();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.Read();
}
}

}
}

附:virtual DWORD Init(LPCTSTR pszRegKey=SYSTEM_ENAME);(从Search.h文件里拷贝的)

总是报 ,怎样调用呢?很急人呢。。。
...全文
179 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
haiwangstar 2009-01-19
  • 打赏
  • 举报
回复
解决方法不是没有。但都不简单。1 .用C在封装一下,2. 包装成COM。

解决方法不能说难。但是都比较烦琐。
haiwangstar 2009-01-19
  • 打赏
  • 举报
回复
wis2007 兄弟:
你到头文件中再确认一下,virtual DWORD Init(LPCTSTR pszRegKey=SYSTEM_ENAME); 这个确实是C++类中的成员函数吧,C是没有virtual function.

如果是C++成员函数,你要明白,是不能在C#中调用的。这个原理三言两语可能讲不清,首先C++的函数是thisCall, 实际参数要多一个,是指针的。

解决方法不是没有。但都不简单。1 .用C在封装一下,2. 包装成COM。
soaringbird 2009-01-19
  • 打赏
  • 举报
回复
Init(LPCTSTR pszRegKey=SYSTEM_ENAME
这不是需要一个参数吗?你在C#里也得声明并传递参数呀
wis2007 2009-01-19
  • 打赏
  • 举报
回复
haiwangstar 朋友,你的答案因该是什么呢? .h文件里是许函数,.dll应该实现了啊,我调用的是dll里的函数啊
haiwangstar 2009-01-16
  • 打赏
  • 举报
回复


很明显.

virtual DWORD Init(LPCTSTR pszRegKey=SYSTEM_ENAME);
虚方法,这个是C++类的成员方法. C#中是不能直接使用C++的类方法的.要么是C形式的导出的函数 然后再[DllImport..],要么把你这个C++ 类库开发成COM然后再引用.


所以以上那些方法都行不通的啦.
cldsj 2009-01-16
  • 打赏
  • 举报
回复
通用的方法是
1、获得dll句柄
2、使用
3、释放
wis2007 2009-01-15
  • 打赏
  • 举报
回复
1,2 楼的方法看着行不通;3,4 楼的经过测试,不正确,还是报我上面的那个错误;5楼:用我这种方法其他的经过测试ok没问题,所以肯定也不是你说得问题。
feiyun0112 2009-01-15
  • 打赏
  • 举报
回复
Search.Dll放到程序同一目录bin\debug

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
zgke 2009-01-15
  • 打赏
  • 举报
回复

[DllImport("D:\\DIPS3.0\\Info\\Bin\\Search.Dll", EntryPoint = "Init", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern uint Init(string SystemName);
看看能用不

或则



[DllImport("D:\\DIPS3.0\\Info\\Bin\\Search.Dll", EntryPoint = "Init", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern uint Init(StringBuilder SystemName);

gogogo 2009-01-15
  • 打赏
  • 举报
回复
[DllImport("D:\\DIPS3.0\\Info\\Bin\\Search.Dll", EntryPoint = "Init", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern uint Init(string pszRegKey);
gis120 2009-01-15
  • 打赏
  • 举报
回复
com 的用regsvr32 注册,不是com的直接在工程管理目录reference 上右键 addreference -〉browse->OK

为什么要写在代码里面呢
vision_n 2009-01-15
  • 打赏
  • 举报
回复
mark~
是不是要传参数啊~

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧