c#写的dll 让vc6,delphi7 等调用...

编程技术爱好者 2010-05-31 10:25:55
呵呵...前几天和一牛交流,牛问我这个问题,我说不能实现,牛说,可以,遂给我看一段代码,一运行,的确可以,可惜当时喝高了,没记住其实现方式,只知道很简单寥寥数语..今求实现方式....望群内大牛积极响应...

不能散300分...可惜,这样的问题应该贴300分才够分量...
...全文
289 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiao_chongzi 2010-09-05
  • 打赏
  • 举报
回复
刚弄成功,可是我的不用向系统注册Dll也能正常用,不知换台机后还能正常用不
  • 打赏
  • 举报
回复
- -
qiqishardgel 2010-05-31
  • 打赏
  • 举报
回复
学习,帮顶!
doubledragon2010 2010-05-31
  • 打赏
  • 举报
回复
路过。学习了哈!
oneatree 2010-05-31
  • 打赏
  • 举报
回复
mark
段传涛 2010-05-31
  • 打赏
  • 举报
回复
是组件方式 ,可以调用 但必须在微软系统下。
Joe-xXx 2010-05-31
  • 打赏
  • 举报
回复
如果纯粹用C#写的类库生成DLL,这个是没办法让非DotNet程序调用。但MS还提供了古老的COM方式,通过此方式即可给其他体系框架的语言使用!
CGabriel 2010-05-31
  • 打赏
  • 举报
回复
Microsoft的文档,互操作性(C# 编程指南)
http://msdn.microsoft.com/zh-cn/library/ms173184(v=VS.90).aspx
皇城龙三 2010-05-31
  • 打赏
  • 举报
回复
Delphi7程序调用C#写的DLL解决办法(转)

近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题。在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:
编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目TestDll,
using System.Runtime.InteropServices;
namespace TestDll
{
public interface I TestClass
{
void YourProcedure(stirng param1);
}
[ClassInterface(ClassInterfaceType.None)]
public class TestClass:I TestClass
{
public void YourProcedure (stirng param1);
{ //自己的代码 }
}
}
完成之后,设置项目的属性“Make assembly COM-Visible”为选中状态。编译之后得到 TestClass.dll,把此dll放到Delphi主程序目录下。打开vs2005自带的工具“Visual Studio 2005命令提示”,输入
Regasm 路径\TestClass.dll 向系统注册此dll。

Delphi程序调用此Dll方式有两种:
一、打开vs2005自带的工具“Visual Studio 2005命令提示”,输入 TlbExp 路径\TestClass.dll 得到一个TestClass.tlb 文件。打开Delphi,选择“Project”--“import type library”找到刚才的TestClass.tlb,点击 CreateUnit,向delphi中引入一个com接口。
delphi 调用代码如下:
var aClass: TestClass;
begin
aClass : = CoTestClass.Create;
aClass. YourProcedure ('参数');
end;
二、不需生成tlb文件,仿照调用Excel的方式。代码如下:
var aClass: Variant;
begin
aClass:= CreateOleObject('TestDll.TestClass');
aClass.YourProcedure ('参数');
end;

以上两种方法都可以调用成功,其中调用regasm.exe向系统注册dll是必需的。第一种方法需要生成tlb文件,并引入delphi中,操作繁琐,但可以看到接口的定义。第二种方法操作简单,但看不到接口的定义。
==============================================================
本人用第二种方法已正常实现功能,但DLL中一些自动创建的方法无法在外部直接调用,需要DLL准备特定的接口函数

皇城龙三 2010-05-31
  • 打赏
  • 举报
回复
VC调用C#的COM组件(DLL)

假设要进行二次开发的程序为 A.exe,要增加的功能使用增加DLL的方法来完成,设为Cdll.DLL,其中含有A、B、C等方法。

其中的方法A要用到C#类库Csharp.DLL中的方法A。要完成这个任务,参考网络上的各种方法与代码,总结其步骤如下:先用VS2008 C#类库项目写成含有A方法的DLL,并设置项目属性以进行COM的封装,然后用VC6 等写C代码进行调用。

一、生成C#类库 Csharp.DLL

(1)在Visual Studio 2008 中创建C#的类库项目 CSharp

(2)实现的类假设为:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;//必须引用此空间


namespace CSharp

{

[Guid("4BF8F1CE-F33D-48bd-A7C8-C4E8EE7376B1")]

public interface iClass1

{

string A();

}


[Guid ("39BE150B-7684-4a16-9574-0F6C15BDE407")]

[ClassInterface(ClassInterfaceType.None)]

public class Class1 : iClass1

{

public string A()

{

return "测试字符串A";

}

}

}



/*通过菜单的 “工具/创建 GUID”。注意要选择Define Guid{….}格式

* 例如:

// {4BF8F1CE-F33D-48bd-A7C8-C4E8EE7376B1}

DEFINE_GUID(<<name>>,

0x4bf8f1ce, 0xf33d, 0x48bd, 0xa7, 0xc8, 0xc4, 0xe8, 0xee, 0x73, 0x76, 0xb1);


// {39BE150B-7684-4a16-9574-0F6C15BDE407}

DEFINE_GUID(<<name>>,

0x39be150b, 0x7684, 0x4a16, 0x95, 0x74, 0xf, 0x6c, 0x15, 0xbd, 0xe4, 0x7);

*/如果要增加其他方法,可如法炮制。

(3)COM生成设置(管理员权限)

配置:选择项目“属性”,选择“生成”,选择“为COM 互操作注册”

打开AssemblyInfo.cs文件,设置 [assembly: ComVisible(true)]

这样就可以生成CSharp.tlb文件

(4)生成解决方案

生成Csharp.DLL和Csharp.tlb即可。

二、生成C或C++的 Cdll.DLL

下面这个是测试程序,用来测试所写的C# COM组件是否正常。在VC6.0中测试

#include "stdafx.h"

#import "CSharp.tlb"//1、导入类型库tlb

using namespace CSharp;//下面COM初始化中可以不用写命名空间

void main()

{ CoInitialize(NULL);// 2、初始化COM以及产生智能指针

iClass1Ptr p(__uuidof(Class1));//命名规则:接口Ptr p((__uuidof(类)))

//3、调用COM中的方法

_bstr_t pt=p->A();//这个方法返回 string类型.可以根据IDE的提示设置类型

printf(pt);

CoUninitialize(); //4、释放环境

}


如果测试正确,那么使用 Visual Studio C++ 6.0 ,创建C++类库项目 Cdll。

定义def 文件如:

LIBRARY Cdll

EXPORTS

A


定义Cdll.cpp文件如:

#include<stdio.h>

#import "CSharp.tlb"

using namespace CSharp;

void A()

{

CoInitialize(NULL);

iClass1Ptr p(__uuidof(Class1));

_bstr_t pt=p->A();

printf(pt);

CoUninitialize();

}

当然,要把Csharp.DLL和Csharp.tlb放到工程文件夹中。

这样最终得到 Cdll.dll和Cdll.lib 两个文件。


C#的COM组件是一个DLL形式的文件,那么能不能像其他DLL一样如系统 kernel32.dll 直接在C代码(或C++代码)中使用呢?也就是不通过COM的封装而是直接使用。这样做是行不通的。因为C#的类库必然是托管类库,虽然文件扩展名也是DLL,但它不是一种传统意义上的DLL,例如没有输出表,所以得经过COM封装才能给非托管代码使用。至于托管代码使用托管DLL 如C#调用C#写的类库那就没必要经过COM的封装了。
deknight 2010-05-31
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
沉了?顶一下...
主要得到希望个人见解...哪怕是错的,只要有启发性,照样接受...

111,098

社区成员

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

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

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