3

我正在尝试制作我的第一个 c# dll。我希望能够使用 win32API 从 ruby​​ 调用它的方法/函数。我制作了这个dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {

        public int PropA = 10;

        public void Multiply(Int32 myFactor)
        {
            PropA *= myFactor;

        }
    }
}

我用 Visual Studio 2010 编译它并得到了我的 ClassLibrary1.dll 文件。

现在对于红宝石部分,我尝试了这个:

f = "c:/path_to_file/ClassLibrary1.dll"
mult = Win32API.new(f,"Multiply",["I"],"I")

但是,我收到以下错误:

Error: #<RuntimeError: (eval):0:in `initialize': GetProcAddress: Multiply or MultiplyA

老实说,我从未创建过 dll,也没有使用 c# 的经验。我只是想开始。我之前通过 win32API 使用了许多 dll 和 Ruby(主要是 user32)。

我猜我的dll不行?

问候,

4

2 回答 2

3

要像在 Win32 上下文中那样使用 DLL 中的函数,这些函数需要从 DLL 中导出可见。这些函数通常带有标记,dllexport并将显示在 DLL 的导出表中。您可以使用诸如dumpbin (MSDN)之类的实用程序来验证 user32 和其他 Win32 DLL 是否执行此操作。

dllexport, dllimport @ MSDN

不幸的是,.NET 没有立即支持使函数导出可见,仅支持通过DllImport (MSDN)属性引入此类函数。

COM 是从非 .NET 环境使用 .NET 编写的代码的最简单方法,但如果您必须使用较低级别的绑定,您可以使用 C、C++/CLI 或任何其他语言和框架组合制作中间 DLL可以将导出标头写入 dll,以调用您的 .NET 代码。

此外,还有几篇关于通过编译后自动化或其他变通方法实现这一点的文章,这里有一些供您参考。

如何自动将 .NET 函数导出到非托管程序 @ CodeProject

不受管理的出口@Google 协作平台

DllExport - 为纯 .NET 程序集提供 C 样式的导出

于 2013-01-16T20:06:48.210 回答
2

无需做任何额外的事情,创建的 DLL 是一个旨在在 .Net 运行时(CLR)内运行的程序集。

您可以按照相关问题中的描述通过 Com 公开它:Can Ruby import a .NET dll? 哪一个

于 2013-01-16T19:47:01.133 回答