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

时间:2013-01-16 19:44:00

标签: c# ruby winapi dll

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

现在对于ruby部分我试过了:

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(主要是user32)。

我猜我的dll不行吗?

问候,

2 个答案:

答案 0 :(得分: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代码。

此外,有一些文章通过编译后自动化或其他解决方法来实现这一点,这里有一些供您参考。

How to Automate Exporting .NET Function to Unmanaged Programs @ CodeProject

Unmanaged Exports @ Google Sites

DllExport - Provides C-style exports for pure .NET assemblies

答案 1 :(得分:2)

没有做任何额外的事情,创建的DLL是一个Assmebly,旨在在.Net运行时(CLR)中运行。

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