创建一个简单的 C# dll 并从 ruby​​ 访问它

Ken*_*Gey 5 c# ruby dll winapi

我正在尝试制作我的第一个 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;

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

但是,我收到以下错误:

Error: #<RuntimeError: (eval):0:in `initialize': GetProcAddress: Multiply or MultiplyA
Run Code Online (Sandbox Code Playgroud)

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

我猜我的dll不正常?

问候,

mek*_*ian 4

要像在 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 样式导出