我用单一方法编写.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());
}
}
这会引发Delphi异常,表示无法连接dll。 从非托管代码启用C#managed dll所需的步骤是什么。
有没有人熟悉这个主题的好例子?
谢谢
答案 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对象。那已经是捷径了。没有进一步的快捷方式!