2010-06-30 83 views
0

我有COM或连接的充分了解的* .dll与LoadLibrary和GetProcess等如何连接德尔福.NET对象

一个人如何在.NET连接类结构或物体进入德尔福代码,以便编译器和编辑器可以连接/关联到.net?

就像Delphi使用(cdecl)或(stdcall)连接到以不同方式构建的方法。我们在.net中有不同的班级声明吗?

.net和Delphi之间的内存管理有所不同吗? Lex Dean。

Lex Dean。

+0

Lex,你好像是StatckOverflow的新手,所以这里提出一个提示:每个问题只问一个问题。 现在,您提出了3个问题,并且将它们分成多个问题会更容易。您可以使用Ctrl-L键盘快捷键将链接放入问题中;这样你可以将一个问题链接到另一个问题,指出一些相关的方面。 玩得开心使用StackOverflow! – 2010-07-01 10:43:29

回答

0

我找不到如何回应还 我知道别人会看你的意见。感谢MSDN网页,我无法找到它作为MSDN库,因为它非常大。现在,如果我离开目标或跟踪侧面,请纠正我。

在德尔福,我们有'项目/导入类型库'从脚本,ActiveX几乎所有的MS产品,MS有史以来为windows导入许多东西。 Delphi 4支持File/New来打开对话框,ActiveX选项卡包含用于多个对象的“COM对象向导”。我们有效地使用Delphi中的接口和对象来创建MS类型库中的对象。就我个人而言,我从来没有使用它,但德尔福丰富的这些方法。从你给我的网页上可以看到,MS说从一个'.net类型库'导入到Delphi中,一个连接到达。从MSDN建议作为一种更强大的方式在Delphi中是建立一个DotNet.pas文件来链接到.Net框架作为一个COM连接,这一直在我心中一直。我的想法已经从根本上重建windows.pas。或者,他们还有更好的方法来获得强大的.net,并降低指令数量来访问对象和方法。
我也在Delphi中发现: - IFormDesigner。而且我有问题,例如在调用时将内存分配给.net对象。以及如何连接到对象的方法。我不确定是开始还是结束,因为没有任何信息记录在互联网上,以我的知识来让我开始。所以这就像在某种程度上潜入黑暗中一样。 同时掌握一些像IUnknown,IDispatch,ISupportErrorInfo,IMarshal这样的子对象和像dispinterface这样的保留字也是一个学习曲线。在Delphi中没有记录其中的一些子对象。我明白HRESULT是用于错误检查的目的,而GetLastWin32Error是从COM对象GetLastError继承而来的。 IntPtr对我来说是新的,我猜是Delphi中的PChar。有时候提到德尔福的自动化对象有点复杂,需要以我需要思考的方式来看待。但是当你在学习的时候,你会倾向于倾向于你。我螨需要使用它们,我的问题是安全的方式来测试一个新的对象与德尔福的小错误支持一直崩溃的Delphi编辑器。

1

我一直在测试AtoZed的“CrossTalk”产品,以便直接从Delphi7为我们的产品调用.Net。 (这些电话是围绕Atalasoft DotNet图像库的.Net 4包装,从上传的多页PDF中提取和检索一些最终用户财务应用程序格式的TIFF图像)。

有一些限制(处理一些.Net集合的问题),但整体CrossTalk似乎到目前为止工作。 (在做出买/不买的决定之前,我仍然需要测试资源泄漏等)。到目前为止我所遇到的任何限制,我都可以通过修改。在供应商的界面上封装了一些包装,将问题对象(比如泛型集合)重新格式化为Delphi方面更容易使用的东西。

如果您遇到像D7这样的Delphi的旧版本,那么您还需要解决语法限制,这些语法限制在D2006/D2007及更高版本等较新版本的Delphi版本中不会看到。到目前为止我看到的最糟糕的是.Net类级别的静态函数,属性和过程被转换为“static”关键字;哪些D7不明白,但德尔福的哪些后续版本。为了解决这个问题,当你的最终目标是第三方代码时,你将再次需要修改一个自定义的.Net包装器来围绕实际的目标,以避免这个问题出现。现在我的评估已经超越了功能集到性能上,到目前为止我看到的最大问题是每次调用的性能很低,大约为百分之八毫秒。在一台WinXP虚拟机上的一个探查器下调用(这会降低速度)。如果您在每次使用的边界上拨打的呼叫数量相对较少,这可能不是问题。但是当我测试从.Net到Delphi的边界跨越1MB .Net字节数组,然后在Delphi For循环中使用转换的ByteArray.Get_Item索引访问来访问.Net数组的每个字节,以将其复制到相应的Delphi字节数组用于Delphi GUI控件,额外的开销导致了一个重大问题。那小0.08毫秒。每次通话时间的开销为1百万“对于”整个.Net-Delphi边界的循环访问加起来将近8秒。 (使用COM传递字节数组时,该特定功能测试运行得更快)。

让Delphi代码调用转换后的.Net System.Drawing.Image的“Save”(ToFile)方法并拥有Delphi TImage“LoadFromFile”实际上要比执行移动所需的1M访问要快得多字节数组一次一个元素,但全部在内存中。

我正在与AtoZed支持部门合作解决这个问题,看看是否有解决方法,并在他们有足够的时间解决问题后发布结果。 1MB字节数组是扫描表格图像的主体。

我希望与他们一起解决这个问题的伟大的事情和原因是,你的Delphi代码可以创建,使用和处理本地.Net对象,而不必处理任何可以通过COM编组的东西边界。 (我在网上看到有关使用COM进行交叉工具交互的资源泄漏的投诉,因为在网络端处理对象时出现问题。也许这是由于糟糕的代码,但这是需要考虑的。)不必处理使用用于跨COM编组数组的SafeArrays,并为每个自定义业务对象分离接口。 CrossTalk还需要处理必须标记所有.Net程序集ComVisible的问题,如果无法控制它们相对于Delphi代码的位置,则必须将.Net COM程序集安装到GAC中。

使用CrossTalk,您可以浏览每个需要使用类或方法的程序集。不要忘记,你还需要明确地浏览并从系统程序集中引入类,例如mscorlib,system,system.drawing等。

如果你的用例不跨越边界调用大量次,至少看起来可能是值得的。我在http://www.managed-vcl.com网站上找到了另一个类似的产品,但与作者联系有点困难,所以我从来没有完全评估过这种方法。