如何解决从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());
}
}
转到程序集属性->程序集信息,并选中“使程序集COM可见”。
使用RegAsm.exe注册我的dll
这将引发Delphi异常,表明它无法连接dll。
从非托管代码启用C#托管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)
, 经过大量调查后,我找到了解决方案:全部与注册参数有关。
必须将标记/ codebase添加到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进行注册
, 如果将程序集制作为x64或AnyCPU,可能会成为问题。由于Delphi是32位(x86),因此您需要使程序集x86或确保regasm.exe还在32位注册表中注册它。您可以通过使用xgas版本的regasm.exe来实现。
, 您应该了解有关正在使用的工具的更多信息。您尝试使用另一种(不太简单)的技术:COM连接两个完全不同的世界(.Net,Delphi)。您的问题非常清楚地表明,您对COM的了解不深,而对.Net的了解可能不多。没有简单的示例可以完全解决您的用例。您必须学习COM,而不是学习如何使.Net代码可用于COM,然后必须学习如何从Delphi调用COM对象。那已经是捷径了。没有其他快捷方式可用!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。