【问题标题】:How to fix this unmanaged exports trouble using Delphi/C#如何使用 Delphi/C# 解决此非托管导出问题
【发布时间】:2011-12-08 12:55:30
【问题描述】:

我在 SO 上的 anwser 中遇到了 Unmanaged exports 技术。

  • 我可以管理自己在SharpDevelop 上进行最简单的项目,尽管我不熟悉 C#。
  • 我想使用 Mike Gavaghan 编写的出色的 Gavaghan.Geodesy (.Net/C#) 库。
  • 我想避免通过 COM 进行互操作。
  • 我绝对使用 Delphi。我只想用它来利用库。

我设法构建了以下代码:

using System;
using System.Collections.Generic;
using System.Text;
using RGiesecke.DllExport;

namespace DelphiNET
{
    internal static class UnmanagedExports
{
    [DllExport("add", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    public static int add(int left, int right) {
        return left + right;            
        }

    }
}

我用 Delphi 进行了探索,但没有成功。

我用 PE 编辑器检查了输出 dll,但结果根本没有导出数据。

我错过了一些东西,我很困惑。

编辑:

请 - 帮我解决问题

【问题讨论】:

  • 你调查过RemObjects Hydra吗?我没有使用它,但我已经为一个项目调查过它。它看起来很棒,并且可以让您轻松地在 Delphi 和 .Net 之间进行互操作。
  • 您提供了很多的背景信息,这些信息似乎与您的要求无关。如果你真的询问它是如何工作的,你可以删除几乎所有你写的东西,然后问它是如何工作的。但是,如果您只是询问它是如何工作的,因为您认为答案会帮助您使您的程序正常工作,那么您应该直接询问如何让您的程序正常工作。如果需要了解非托管导出的工作原理,那么无论如何都会有人的答案包含该信息,因此如果它不是您真正想要的,则无需询问。
  • @David M:专有解决方案不适合我。
  • 您使用的是哪个 C# 编译器?
  • @Rob Kennedy:我提供它们以供审查(可能有问题),也作为我之前努力的证据(通常在 SO 上需要)。

标签: c# .net delphi dll interop


【解决方案1】:

我设法让它像这样工作:

  1. 下载 C# 项目template。这需要 Visual Studio,但您应该可以使用 Express 版本。
  2. 根据模板新建项目。
  3. 构建该项目。
  4. 在 Dependency Walker 中加载 DLL 以查看它确实导出了函数。我成功地从 Delphi 调用了该函数。

请注意,查找 DLL 的路径是 bin\Debug\x86bin\Debug 中有一个 DLL,但它没有导出。也许这就是你一直在看的。

【讨论】:

  • 我成功了!谢谢你让我想起了 Dependency Walker,我知道,但我从来没有想过。鉴于我在 .Net/C# 上的水平很差,坚持使用 SharpDevelop 对我来说是有害的。此外,作者对该设置进行了广泛的测试。德尔福摇滚。
  • 我完全跑题了。很明显,Rob Kennedy 说这段代码被破坏了绝对正确。我的解决方案不会触发应该允许如此需要的导出的 MSBuild 任务。我稍后尝试根据模板(手动调整)为我的设置(SharpDevelop)获取一个工作示例,但事实证明我的工具链中缺少“lib.exe”,或者我仍然必须在某处修复一些路径.
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2010-11-10
  • 2023-03-11
  • 2015-09-18
  • 2016-11-05
  • 2013-06-12
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多