【问题标题】:Creating a simple c# dll and access it from ruby创建一个简单的 c# dll 并从 ruby​​ 访问它
【发布时间】:2013-01-16 19:43:59
【问题描述】:

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

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

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 不正常?

问候,

【问题讨论】:

标签: c# ruby winapi dll


【解决方案1】:

要像在 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

【讨论】:

    【解决方案2】:

    无需做任何额外的事情,所创建的 DLL 就是一个旨在在 .Net 运行时(CLR)中运行的程序集。

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

    【讨论】:

    • 我完全没有使用 dll 的经验。什么样的 dll 可用于 win32API?而且,你知道那些教程吗?使用 win32ole 不是我想要的工作方式...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2012-05-12
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多