我正在尝试制作我的第一个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不行吗?
问候,
答案 0 :(得分:3)
要在Win32上下文中使用DLL中的函数,这些函数需要从DLL导出可见。这些函数通常标有dllexport
,并将显示在DLL的导出表中。您可以使用dumpbin (MSDN)等实用程序验证user32和其他Win32 DLL是否执行此操作。
不幸的是,.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?