您的位置:首页 > 编程语言 > Delphi

Delphi程序调用C#.Net编译的DLL并打开窗体(详解)

2014-12-16 15:39 1041 查看
转自:
http://www.csframework.com/archive/2/arc-2-20110408-1307.htm
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)

最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是Delphi写的, 我不想再重复写一次,于是尝试编译成COM组件提供给Delphi调用.花了一下午研究技术, 结果很满意, 调试通过, 特分享受出来给大家学习.

实现步骤:

1、生成密钥文件用于给程序集强名称签名(必须)

sn -k MyKey.snk

2、使用强名称签名的Key编译成类库Tester.DLL

csc /t:library /keyfile:MyKey.snk Tester.cs

3、生成类型库 (此tlb文件提供给Delphi导入, 使用OLE方式调用此步可省略了)

tlbexp Tester.dll /out:Tester.tlb

4、生成注册DLL的注册表文件

regasm Tester.DLL /regfile:Tester.reg

5、运行Tester.reg

将上面四个步骤打包成一个BAT文件自动生成DLL, 在运行Delphi程序前请先运行Tester.reg注册COM.

打包Installer,Setup.exe 别忘记打包第5步.

reg.bat 文件内容:

sn -k MyKey.snk

csc /t:library /keyfile:MyKey.snk Tester.cs

tlbexp Tester.dll /out:Tester.tlb

regasm Tester.DLL /regfile:Tester.reg

且看运行效果:

Delphi程序Project1.exe (图片中英文拼写错误,不想改了,sorry!)



点Call DLL按钮成功打开.Net窗体,测试通过!



注意: 开发环境中必须在Visual Studio 2008命令提示中运行reg.bat!!! 如下图:





两种可能的错误提示及解决方案:

1. 出现以下提示说明没有注册COM组件, 请运行Tester.reg.



2. 出现以下提示说明您调用了一个没有签名的.Net方法(无参方法)



C# Code:

/// <summary>

/// 测试类. 请给所有方法提供一个参数,即使是无用的签名

/// </summary>

public class Tester

{

public string GetMyKey(int param)

{

return "Key:www.csframework.com";

}

public string GetMyName(string input)

{

return "Jonny Sun" ":" input;

}

public int GetMyAge(string yourName)

{

return 33;

}

/// <summary>

/// 显示消息并打开窗体

/// </summary>

/// <param name="msg">消息</param>

/// <returns></returns>

public int ShowMessage(string msg)

{

MessageBox.Show(msg);

frmTest.Execute(msg);//打开窗体

return 100;

}

/// <summary>

/// 无签名(参数)的方法给Delphi调用,调用失败,Delphi程序会抛出异常。

/// </summary>

/// <returns></returns>

public int CallMethodWithNoSign()

{

return -1;

}

}

// 来源:www.CSFramework.com, C/S结构框架学习网

Delphi Code:

procedure TForm1.Button1Click(Sender: TObject);

var

OBJ: Variant; //OLEVariant Type.

ResultValue: string; //Value returned from C#

i:Integer;//Value returned from C#

begin

try

try

OBJ := CreateOleObject('Dll4DelphiCall.Tester');

//Test a function with signature.

ResultValue := OBJ.GetMyName('HELLO!C/S框架网 www.csframework.com');

ShowMessage(ResultValue);

ResultValue := OBJ.GetMyAge('JONNY!');

ShowMessage(ResultValue);

ResultValue := OBJ.GetMyKey(0);

ShowMessage(ResultValue);

i:=OBJ.ShowMessage('Call CSharp Window....(Sender:Delphi Form)');

ShowMessage(VarToStr(i));//Show result ID from C# function.

except

on e: Exception do

begin

ShowMessage(e.Message);

end;

end;

finally

OBJ := Unassigned;

end;

end;

// 来源:www.CSFramework.com, C/S结构框架学习网

原创作品,如转载请注明本文来自C/S框架网 www.csframework.com

Delphi/C#源码下载:


点击下载附件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: