2011-05-30 151 views
6

我用单一方法编写.Net 3.5 dll,这个方法将由Delphi .exe调用。 不幸的是它不起作用。从Delphi调用C#dll

步骤: 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所需的步骤是什么?

有没有人熟悉关于该主题的好例子?

谢谢

+0

到底是如何你想连接的对象?您是使用向导(它为您生成一个包装单元)导入它还是直接加载库? – 2011-05-30 12:51:20

+0

我发现了这些问题的解决方案 - 请参阅下面的回答 – 2011-06-22 07:43:43

回答

7

经过大量调查后,我发现解决方案:它全部是关于注册参数。 标志/代码库必须添加到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 /代码库进行注册

-7

您应该详细了解您正在使用的工具。您尝试使用另一个(不是很简单)的技术连接两个完全不同的世界(.Net,Delphi):COM。你的问题很清楚地表明你没有很好地理解COM,可能不是.Net。没有一个简单的例子可以解决你的使用案例。你必须学习COM,而不是必须学习如何使.Net代码可用于COM,然后你必须学习如何从Delphi调用COM对象。这已经是捷径。没有更多快捷方式可用!

+13

我认为发布教学答案的效率并不高,比如小学老师手上拿着(象征性)巴掌,因为您一直很顽皮。我没有看到原始问题有任何问题。他可以犯错误,犯错误,犯错误,向他们学习,然后继续前进。 – costa 2014-01-15 23:51:17

2

有一件事情,如果你让你的程序集x64或AnyCPU可能是一个问题。由于Delphi是32位(x86),因此您需要组装x86或确保regasm.exe将其注册到32位注册表中。您可以通过使用regasm.exe的x86版本来完成此操作。

29

您可以通过我的project template for unmanaged exports

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

在Delphi中,你会导入它像这样有更多的运气跳过COM部分:

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

我不得不向下投你的问题,虽然。甚至不关心提供可编译的代码。 (你的C#方法不会返回一个值,但它期望为int)

+0

嗨,罗伯特,在将zip文件放在适当的位置后(My Documents \ Visual Studio 20 ** \ Templates \ ProjectTemplates),我看不到该模板。我正在使用VS2010,你熟悉它吗? – 2011-06-01 06:28:39

+0

您确实下载了UnmanagedExportLibrary.zip,对吧?包含示例的页面链接到DllExport.zip,它只是构建任务和一些库,而不是模板。如果您确实使用了该模板:请转至工具/选项/项目和解决方案。在那里您会找到属性“用户项目模板位置”。这是VS将在其中搜索项目模板的文件夹。 – 2011-06-01 07:38:00