创建一个简单的c# dll并从ruby访问它
本文关键字:dll 并从 ruby 访问 简单 一个 创建 | 更新日期: 2023-09-27 17:53:38
我正在尝试制作我的第一个c# dll。我想能够调用它的方法/函数从ruby与win32API。我制作了这个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使用过Ruby的许多dll(主要是user32)。
我猜我的dll不正常?
认为,
要像在Win32上下文中那样使用DLL中的函数,这些函数需要从DLL中导出可见。这些函数通常用dllexport
标记,并将显示在DLL的导出表中。您可以通过使用诸如dumpbin (MSDN)之类的实用程序来验证user32和其他Win32 dll是否执行此操作。
dllimport, dllimport @ MSDN
不幸的是,. net没有立即支持将函数导出可见,只能通过DllImport (MSDN)属性引入这样的函数。
COM是使用。net中编写的代码的最简单的方法。.NET环境,但如果你必须使用较低级别的绑定,你可以用C、c++/CLI或任何其他语言和框架组合来创建一个中间DLL,这些语言和框架可以将导出头文件写入DLL,以调用你的。NET代码。
同样,有一些文章是关于通过编译后自动化或其他解决方法来实现这一点的,这里有一些供您参考。
如何自动导出。net函数到非托管程序@ CodeProject
Unmanaged Exports @ Google Sites
DllExport -为纯。net程序集提供c风格的导出
不需要做任何额外的事情,创建的DLL就是一个打算在。net运行时(CLR)内运行的程序集。
你可以通过Com公开它,如相关问题所述:Ruby可以导入。net dll吗?