- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有人可以在这里发布一个如何在 Delphi 中托管 CLR 的示例吗?我读过类似的 question在这里,但我不能使用 JCL,因为我想在 Delphi 5 中托管它。谢谢。
编辑这个article关于在 Fox Pro 中托管 CLR 看起来很有希望,但我不知道如何从 Delphi 访问 clrhost.dll。
编辑 2: 我放弃了对 Delphi 5 的要求。现在我正在尝试使用 Delphi 7 的 JCL。但是我还是找不到任何示例。这是我到目前为止所拥有的:
我的 C# 程序集:
namespace DelphiNET
{
public class NETAdder
{
public int Add3(int left)
{
return left + 3;
}
}
}
我已经将它编译成 DelphiNET.dll
。
现在我想使用这个来自 Delphi 的程序集:
uses JclDotNet, mscorlib_TLB;
procedure TForm1.Button1Click(Sender: TObject);
var
clr: TJclClrHost;
ads: TJclClrAppDomainSetup;
ad: TJclClrAppDomain;
ass: TJclClrAssembly;
obj: _ObjectHandle;
ov: OleVariant;
begin
clr := TJclClrHost.Create();
clr.Start;
ads := clr.CreateDomainSetup;
ads.ApplicationBase := 'C:\Delhi.NET';
ads.ConfigurationFile := 'C:\Delhi.NET\my.config';
ad := clr.CreateAppDomain('myNET', ads);
obj := (ad as _AppDomain).CreateInstanceFrom('DelphiNET.dll', 'DelphiNET.NETAdder');
ov := obj.Unwrap;
Button1.Caption := 'done ' + string(ov.Add3(5));
end;
这以错误结束:EOleError: Variant does not reference an automation object
我已经很长时间没有使用 Delphi 了,所以我被困在这里......
解决方案:COM 可见性存在问题,默认情况下并非如此。这是正确的 .NET 程序集:
namespace DelphiNET
{
[ComVisible(true)]
public class NETAdder
{
public int Add3(int left)
{
return left + 3;
}
}
}
在 Delphi 中使用 .NET 时,重要的是在程序开始时调用 Set8087CW($133F);
(即在 Application.Initialize;
之前)。 Delphi 默认启用浮点异常(参见 this),CLR 不喜欢它们。当我启用它们时,我的程序奇怪地卡住了。
最佳答案
这是另一种选择。
那是 C# 代码。即使您不想使用 my unmanaged exports ,它仍然会解释如何在不通过 IDispatch 的情况下使用 mscoree(CLR 托管的东西)(IDispatch 非常慢)。
using System;
using System.Collections.Generic;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace DelphiNET
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31")]
public interface IDotNetAdder
{
int Add3(int left);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class DotNetAdder : DelphiNET.IDotNetAdder
{
public int Add3(int left)
{
return left + 3;
}
}
internal static class UnmanagedExports
{
[DllExport("createdotnetadder", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
static void CreateDotNetAdderInstance([MarshalAs(UnmanagedType.Interface)]out IDotNetAdder instance)
{
instance = new DotNetAdder();
}
}
}
这是 Delphi 接口(interface)声明:
type
IDotNetAdder = interface
['{ACEEED92-1A35-43fd-8FD8-9BA0F2D7AC31}']
function Add3(left : Integer) : Integer; safecall;
end;
如果你使用非托管导出,你可以这样做:
procedure CreateDotNetAdder(out instance : IDotNetAdder); stdcall;
external 'DelphiNET' name 'createdotnetadder';
var
adder : IDotNetAdder;
begin
try
CreateDotNetAdder(adder);
Writeln('4 + 3 = ', adder.Add3(4));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
当我改编 Lars 的样本时,它看起来像这样:
var
Host: TJclClrHost;
Obj: IDotNetAdder;
begin
try
Host := TJclClrHost.Create;
Host.Start();
WriteLn('CLRVersion = ' + Host.CorVersion);
Obj := Host.DefaultAppDomain
.CreateInstance('DelphiNET',
'DelphiNET.DotNetAdder')
.UnWrap() as IDotNetAdder;
WriteLn('2 + 3 = ', Obj.Add3(2));
Host.Stop();
except
on E: Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
在这种情况下,您当然可以从 C# 代码中删除“UnmanagedExports”类。
关于c# - 使用/不使用 JCL 在 Delphi 中托管 CLR - 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048540/
我遇到了以下场景,我对 cond 参数如何在前面的步骤中起作用有点困惑,这是 flsuhed 出来的。 比如…… //第一步执行 //步骤 2 执行条件=(0,ne,step1) //步骤 3 执行条
我试图了解 JCL 文件中哪里出了问题。我的代码如下: //MULTG013 JOB 1,NOTIFY=&SYSUID //STEP1 EXEC PGM=ICEGEN
我遇到了以下场景,我对 cond 参数如何在前面的步骤中起作用有点困惑,这是 flsuhed 出来的。 比如…… //第一步执行 //步骤 2 执行条件=(0,ne,step1) //步骤 3 执行条
我对如何在 JCL 中为我在 COBOL 类中执行的作业创建符号变量感到有点困惑。 例如,我应该“为 PARM 选项指定一个符号参数,并将 TEST 和 APOST 指定为默认值。” 如何将“PARM
要调用 Rexx 程序并传递参数,可以使用 IKJEFT01 // SET PARM1= // SET PARM2= //AUDITDS EXEC PGM=IKJEFT01, // PARM
在尝试日志依赖时,我遇到了以下情况: version99 http://version99.qos.ch/
我正在使用 JCL,并且有一个叫做 ICEMAN 的东西,它在使用 IBM SORT 实用程序 DFSORT 时被调用。 DFSORT 可用于排序、复制或合并文件等。在下面的示例中,输出来自 SORT
我尝试使用 IBM z/OS 运行以下 JCL 程序 //PAYMENT JOB MSGCLASS=H //PAYMENT EXEC PGM=PAYMENT,REGION=1024K
//STE1 IF RC EQ 1 THEN .... //结束 返回代码给我 FLUSH 并且所有其他作业都因此没有执行谁可以帮我这个事。是因为我没有给ELSE吗? 最佳答案 如果您有运行步骤的条件
我正在尝试以这种方式创建和删除数据集名称中带有 JCL 符号的数据集: // SET DATE=20110809 //* DELETE DATASET //DEL01 EXEC PGM=IDCA
我想知道 KEEP 和 UNCATLG 之间的区别。 据我所知,两者都将删除数据集的目录条目。 感谢和问候,玛纳西 最佳答案 我不相信。 KEEP如果该条目已经存在,则不会从目录中删除该条目。 UNC
有没有办法访问可执行文件中包含的Jedi调试信息(JDBG)? 微软调试工具向我指出了二进制文件中的堆栈链,我想知道这些偏移量对应的方法/过程/函数: user32.dll!SendMessageA+
有谁知道 Delphi 7 的 TEvaluator JCL 类中包含哪些预定义函数(例如 ABS 函数)? 最佳答案 Math.pas 中没有任何标准函数包括。默认评估解析器中实现的所有内容都是运算
背景 我们遇到一个问题,有时 Devexpress 中的网格会引发异常“引发 EConvertError:无法将 nil 分配给 TFont”。 但是为了追踪其真正原因,我们将 cxEdit 中的 F
JCL 库有一个条件定义 UNITVERSIONING。我不知道为什么这个选项存在,也不知道如何使用它。我知道有一个名为 JclUnitVersioning.pas 的单元,但找不到用途。 在实际项目
摘要: 我无法让 JCL 压缩库打开任何跨区存档。它显示了 borlands 'windows.pas' 中定义的错误“(0000001) 错误函数”; 场景: 使用 JCL 压缩示例压缩的单个存档。
在 JCL 中,通常使用 &(与号)后跟变量名称来创建符号参数。 但是在数据集名称中,变量名称后面必须跟有点号。示例: //J&USER JOB 1 //MYSTEP EXEC PGM=MYPROG
有人有使用 Actian 的 JCL 将数据检索到 Java 中松散耦合的普适数据库的示例吗?我连接的数据库只有 DAT 文件。我的目标是在 Pervasive 和 MS SQL 之间建立联系。 我不
我有一个生成随 secret 码的程序。这些引脚是用 Java 生成的,然后通过 NATURAL 程序存储在大型机中。从那里,它们最终由批处理 JCL 作业实际打印,该作业调用 MVS SCRIPT
我有一个非常棘手的问题。我有一种容器,可以使用具有类 ComponentContext 作为参数的方法来运行自定义 JAR。加载后,我想通过反射调用此方法,但有一个问题 - 我必须使用相同的类加载器(
我是一名优秀的程序员,十分优秀!