从Delphi调用C#dll

Sat*_*ies 13 .net c# 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());
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 转到装配属性 - >装配信息并选中"使装配COM可见"
  2. 使用RegAsm.exe注册我的DLL

这会引发Delphi异常,表明它无法连接dll.从非托管代码启用C#managed dll所需的步骤是什么?

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

谢谢

Rob*_*cke 34

通过使用我的项目模板进行非托管导出,您可以更好地跳过COM部件

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

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

function MyDllMethod(i : Integer) : Integer; stdcall; extern 'YourAssembly.dll';
Run Code Online (Sandbox Code Playgroud)

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


Sat*_*ies 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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