【问题标题】:How do I call method C# Dll method using RegAsm?如何使用 RegAsm 调用方法 C# Dll 方法?
【发布时间】:2019-02-25 10:45:08
【问题描述】:

我创建了一个使用“Register for com interop”的 C# Dll,并设法使用 RegAsm 注册它:

RegAsm.exe -tlb -codebase MathLib.dll

之后我收到了消息:

“程序集导出到'C:\Test\MathLib.tlb',类型库注册成功”

我现在如何调用 Dll 中的方法?例如它有一个公共函数:

int Add(int a, int b) { return a + b; }

将 2 个数字相加并返回结果。如何从命令行调用它并查看操作结果?

非常感谢。

【问题讨论】:

  • 命令行?您注册了一个 COM 对象,然后假设您需要从非 .NET 代码中使用这些类型(如果它只是命令行,那么使用 PowerShell 您可以直接运行它而无需 COM 麻烦)。 AFAIK 没有任何实用程序可以使用命令行从 COM 对象执行任意方法。你想解决什么问题?
  • 非常感谢您的回复,我以前没有使用过 COM 对象,但对我来说,如果我从命令行进行注册,那么其他操作(比如从该DLL)应该从命令行执行。我不明白,如果我想从非 .NET 代码(例如 AutoIt 或 Visual Basic)中使用我的 Dll,那么为什么我不能从那里完成所有操作呢?为什么我必须从命令行进行注册?
  • 除非您在谈论 VB6,否则 VB 是一种 .NET 语言,您可以使用从 C# 代码编译的程序集。您在哪里注册 COM 对象与您如何使用它无关。您在线注册了汽车保险,但您不会在客厅的沙发上开车。

标签: c# methods dll registration regasm


【解决方案1】:

它是如何工作的?

创建一个新的类库或继续 现有的。然后添加 UnmanagedExports Nuget 包。

这几乎是所需的所有设置。

现在你可以编写任何类型的静态方法,用 [DllExport] 并从本机代码中使用它。它就像 DllImport 一样工作, 所以你可以自定义参数/结果的编组 MarshalAsAttribute.

在编译过程中,我的任务会修改IL来添加需要的 出口。

以下几行就是一个很好的例子:

class Test
{
  [DllExport("Add", CallingConvention = CallingConvention.Cdecl)]
  public static int Add(int a, int b)
  {
     return a + b;
  } 
}

如您所知,请继续使用 RegAsm 注册您的库。要将您的 COM 函数重新导入另一个项目,您应该像本地方法一样对其进行编组,在代码中使用 [DLLImport] 属性声明它。

参考资料:

Unmanaged Exports

UnmanagedExports Nuget package

我希望在某种程度上有所帮助。

【讨论】:

  • 我正在检查链接,谢谢。使用这种方法时,我的文件夹中还会有一个exe文件和一个dll文件吗?还是在编译过程中将Dll合并到Exe中,这样我就只有一个没有Dll的Exe文件?
  • 所以,这篇文章解释了如何创建一个DLL并将一些函数导出到Native Code。可以从任何编程语言访问导出为本机代码的函数。要在 C# 上重新使用它,您应该 Marshall 函数。 COM 部分,据我所见,您已经在使用 RegAsm。您错过了将方法导出为本机代码。事实上,最后你会得到一个 com DLL。不是exe文件。此 DLL 将包含您导出的方法 Add。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多