【问题标题】:Call C# dll from Delphi从 Delphi 调用 C# dll
【发布时间】:2011-05-30 09:39:48
【问题描述】:

我用单一方法编写了.Net 3.5 dll,由Delphi .exe调用。 不幸的是,它不起作用。

步骤: 1. 使用代码创建C# 3.5 dll:

public class MyDllClass
{
    public static int MyDllMethod(int i)
    {
        MessageBox.Show("The number is " + i.ToString());
    }
}
  1. 转到程序集属性 --> 程序集信息并检查“使程序集 COM 可见”
  2. 使用 RegAsm.exe 注册我的 dll

这会引发 Delphi 异常,表明它无法连接 dll。 从非托管代码启用 C# 托管 dll 的使用需要哪些步骤。

有没有人熟悉这个主题的好例子?

谢谢

【问题讨论】:

  • 您究竟是如何尝试连接对象的?您是使用向导导入它(它会为您生成一个包装器单元)还是直接加载库?
  • 我找到了解决这些问题的方法 - 请参阅下面的答案

标签: c# .net delphi managed-code


【解决方案1】:

使用我的project template for unmanaged exports 跳过 COM 部分可能会更幸运

class MyDllClass
{
    [DllExport]
    static int MyDllMethod(int i)
    {
        MessageBox.Show("The number is " + i.ToString());
        return i + 2;
    }
}

在 Delphi 中,您可以像这样导入它:

function MyDllMethod(i : Integer) : Integer; stdcall; extern 'YourAssembly.dll';

不过,我不得不否决你的问题。因为甚至不关心提供可以编译的代码。 (您的 C# 方法不返回值,但它期望为 int)

【讨论】:

  • 您好 Robert,将 zip 文件放在正确的位置(我的文档\Visual Studio 20**\Templates\ProjectTemplates)后,我看不到模板。我用的是VS2010,你熟悉吗?
  • 您确实下载了 UnmanagedExportLibrary.zip,对吗?包含示例的页面有一个指向 DllExport.zip 的链接,它只是构建任务和一些库,而不是模板。如果您确实使用了该模板:转到工具/选项/项目和解决方案。在那里您会找到“用户项目模板位置”属性。这是 VS 将在其中搜索项目模板的文件夹。
  • 嗨罗伯特。我只是想问一下您是否知道为什么我在 Delphi 中尝试使用此示例时得到一个 nil 地址(dll 中没有入口点)?
【解决方案2】:

经过大量调查,我找到了解决方案:一切都与注册参数有关。 标志 /codebase 必须添加到 regasm 命令。

许多帖子建议在 C# Com 公开对象上使用 Guid 和其他 COM 属性,我设法使用 ComVisible(true) 属性和 regasm /tlb /codebse 命令提供 COM 功能。

代码:

[Guid("7DEE7A79-C1C6-41E0-9989-582D97E0D9F2")]
[ComVisible(true)]
public class ServicesTester
{
    public ServicesTester()
    {
    }

    //[ComVisible(true)]
    public void TestMethod()
    {
        MessageBox.Show("You are in TestMEthod Function");
    }
}

正如我提到的,我使用 regasm.exe /tlb /codebase 来注册它

【讨论】:

    【解决方案3】:

    如果您的程序集是 x64 或 AnyCPU,可能会出现问题。由于 Delphi 是 32 位 (x86),您需要将程序集设置为 x86 或确保 regasm.exe 也在 32 位注册表中注册它。您可以使用 x86 版本的 regasm.exe 来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多