从Delphi调用C#dll

我用单一方法编写.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. 转到assembly属性 – >assembly信息并选中“使assemblyCOM可见”
  2. 使用RegAsm.exe注册我的DLL

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

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

谢谢

通过使用我的项目模板进行非托管导出,您可以更快地跳过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)

经过大规模调查后,我找到了解决方案:这都是注册参数。 必须将标志/代码库添加到regasm命令。

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

代码:

 [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来注册它

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

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