Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
2013-10-11 15:29
681 查看
实现步骤:
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#源码下载:
http://pan.baidu.com/s/1ceBTp
本文来自C/S框架网
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#源码下载:
http://pan.baidu.com/s/1ceBTp
本文来自C/S框架网
相关文章推荐
- Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
- Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- C# 调用带有复杂参数的C++ ,delphi dll 注意事项备注。(C++ dll 怎么回调C# 程序,参数怎么写?)
- C#调用Delphi的dll之详解
- Delphi 调用 C# Dll 时一个编译问题 mscorlib_TLB.h Ambiguity between 'String' and 'System::String'
- C# 编译生成dll文件供程序调用的两种方法
- 【转】C#生成dll文件:如何用C#编译生成dll文件即动态链接库文件供其它程序调用
- asp.net C# 调用 delphi的dll
- C#调用Delphi的dll之详解-完整版_附有可下载Demo
- [整理]c#简单调用DELPHI DLL封装窗体
- Delphi6 调用 C# Dll 时一个编译问题
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- C#调用Delphi的dll之详解-完整版_附有可下载Demo
- C#调用Delphi的dll之详解
- (二)一个工作任务引起的乱战——C++程序编译为dll,让C#调用
- [轉]c#简单调用DELPHI DLL封装窗体
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- C# 窗体边角圆弧处理及在C#中调用外部程序(执行批处理,打开窗口等)
- 将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题