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

我正在尝试制作我的第一个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不行吗?

问候,

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

您可以通过Com公开它,如相关问题中所述: Ruby可以导入.NET dll吗? 哪一个

要在Win32上下文中使用DLL中的函数,需要从DLL导出可见这些函数。 这些函数通常使用dllexport标记,并将显示在DLL的导出表中。 您可以使用dumpbin(MSDN)等实用程序validationuser32和其他Win32 DLL是否执行此操作。

dllexport,dllimport @ MSDN

不幸的是,.NET没有立即支持使函数导出可见,只是为了通过DllImport(MSDN)属性引入这些函数。

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

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

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

@ Google协作平台的非托管导出

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