求教!用最简单的办法实现C#调用使用VC6封装的DLL中的类!

anlymaple 2012-11-29 09:35:37
请写一个实例即可,欢迎使用COM组件方式,请将什么代码写入到什么文件写明,只求最简单方式即可,要求就是我在vc6中将其源代码封装成DLL文件,然后使用VS2008进行调用其中的类,由于此封装类原型是有构造函数,使用前需初始化后再调用其公有方法,所以不能用简单的export 的方式直接调用函数来做,所以只能封装成类,在C#中直接调用,其实这个很简单,就是没有范例,本人对COM等不熟悉,故需高人指点一二,由于急需,请迅速结贴,谢谢!
...全文
256 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2012-11-30
  • 打赏
  • 举报
回复
引入dll直接调用
anlymaple 2012-11-30
  • 打赏
  • 举报
回复
没做过这种,请问C#中如何调用?
cheng2005 2012-11-30
  • 打赏
  • 举报
回复
引用 9 楼 elvai_wind 的回复:
我原有的文件都是VC6编码的,而且很复杂,只想直接打包,你这样搞一下,不是让我用VS的版本重新编码么?
你要明白一个事情,不是所有的东西都支持跨语言调用的,只有符合公用接口(如COM)才可以调用。 尽管你不想重新编码,但是你最起码要做的事情就是封装符合规范的公用接口。
anlymaple 2012-11-30
  • 打赏
  • 举报
回复
我原有的文件都是VC6编码的,而且很复杂,只想直接打包,你这样搞一下,不是让我用VS的版本重新编码么?
anlymaple 2012-11-29
  • 打赏
  • 举报
回复
楼上2人没听懂,我目前的项目是把一个纯C++开发的源码改编为C#,但是其源码中调用了一些更底层的lib包,于是我对其进行分解,分解出几个部分,主框架用C#代码写,分解的部分分别打包DLL处理,不过一般的DLL只能调用其内的函数,有一个部分比较复杂,必须使用类,没办法了,只能打包成DLL,用C#直接调用其中的类来处理,我查了资料说可以用COM组件来实现C#调用DLL中的类,但是COM组件用不来,其实我只需要知道怎么写C++的COM组件,然后再C#中调用组件中的类就行了,我手里有制作DLL的功能源码,只要知道如何将一个C++的类通过最简单的办法(不管是用COM组件还是其他办法)打包成DLL后,用C#成功调用(成功在C#中定义出DLL的类)即可,我要求很简单,比如C++功能就是实现x+y ; 类定义 class sum { public: int x; int y; int ca(int a,int b); } 函数实现: int sum::ca(int a,int b) { x=a; y=b; return x+y; } 然后通过某办法打包成DLL 利用C#调用DLL中包的类 sum,初始化后,通过类调用其函数 ca实现x+y效果。 我要求就这么简单,现在懂了吧!
ksq2010 2012-11-29
  • 打赏
  • 举报
回复
你手头上肯定有C++开发人员开发的dllDemo.dll,比如这个dllDemo.dll就只有求和,求最大值,求最小值的DLL,他们已经为你打包好了,那么下面举个例子,如何调用这个DLL.

/在c#中调用。新建,项目,控制台应用程序。(注意是C#,不是C#环境您重新切一下),
//在Program.cs中贴入以下代码:
//by 孔苏群  2012-11-29
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;//引入dll文件中的函数   
class Program
{        //引入dll文件中的函数        
    [DllImport("dllDemo.dll")]
    private static extern int Sum(int a, int b);
  // private static extern int MC_SetFileName(int PlayerID , StringBuilder FileName)
    [DllImport("dllDemo.dll")]
    private static extern int Max(int a, int b);
//   知道怎么改了吧
    [DllImport("dllDemo.dll")]
    private static extern int Min(int a, int b);
    static void Main(string[] args)
    {
        int a = Sum(3, 5);
        Console.WriteLine(a);
        Console.WriteLine(Max(5, 10));
        Console.WriteLine(Min(12, 25));
        Console.ReadKey();//直接main里边最后加个Console.Read()不就好了。要按键才退出。 }   
    }
}
jshi123 2012-11-29
  • 打赏
  • 举报
回复
最方便的方法是写个clr混合类库,对vc6的类进行简单封装成托管类,桥接一下,这样c#中就可以直接引入这个dll并使用托管类,比转成com还要方便。比如你的例子可以这样封装:

public ref class Sum {
	private:
		sum* m_pNativeSum;
	public:
		Sum() : m_pNativeSum(new sum()) {}
		property int x 
		{
			int get() { return m_pNativeSum->x; }
			void set(int x) { m_pNativeSum->x = x; }
		}
		property int y 
		{
			int get() { return m_pNativeSum->y; }
			void set(int y) { m_pNativeSum->y = y; }
		}
		int ca(int a, int b) {  m_pNativeSum->ca(a, b); } 
		~Sum() { delete m_pNativeSum; }
};
garfieldzf 2012-11-29
  • 打赏
  • 举报
回复
你要封装的DLL没给你API吗? 一般封装DLL时数据类型比较关键。
anlymaple 2012-11-29
  • 打赏
  • 举报
回复
继续顶,求助!
anlymaple 2012-11-29
  • 打赏
  • 举报
回复
继续顶!一定要弄出来!

7,774

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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