从Delphi调用C#dll

时间:2011-05-30 09:39:49

标签: c# .net delphi managed-code

我用单一方法编写.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
  3. 这会引发Delphi异常,表示无法连接dll。 从非托管代码启用C#managed dll所需的步骤是什么。

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

    谢谢

4 个答案:

答案 0 :(得分:33)

使用我的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)

答案 1 :(得分:8)

经过大规模调查后,我找到了解决方案:这都是注册参数。 必须将标志/代码库添加到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来注册它

答案 2 :(得分:2)

如果您制作了程序集x64或AnyCPU,那么可能会出现问题。由于Delphi是32位(x86),你需要使你的程序集x86或确保regasm.exe也在32位注册表中注册它。您可以使用x86版本的regasm.exe来执行此操作。

答案 3 :(得分:-15)

您应该了解有关您正在使用的工具的更多信息。您尝试使用另一种(不太简单的)技术连接两个完全不同的世界(.Net,Delphi):COM。你的问题非常明确地表明你没有很好地理解COM而且可能不是.Net。没有简单的例子可以完全解决您的用例。您必须学习COM,而不是必须学习如何为COM提供.Net代码,然后您必须学习如何从Delphi调用COM对象。那已经是捷径了。没有进一步的快捷方式!