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)
这会引发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)
经过大规模调查后,我找到了解决方案:这都是注册参数.必须将标志/代码库添加到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来注册它