3

初めての 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は大丈夫ではないと思いますか?

よろしく、

4

2 に答える 2

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 コードを呼び出すことができます。

また、コンパイル後の自動化またはその他の回避策を介してこれを実現するための記事がいくつかあります。参考までにいくつか紹介します。

アンマネージド プログラム @ CodeProject への .NET 関数のエクスポートを自動化する方法

管理されていないエクスポート @ Google サイト

DllExport - 純粋な .NET アセンブリの C スタイルのエクスポートを提供します

于 2013-01-16T20:06:48.210 に答える
2

特別なことを何もしなくても、作成された DLL は、.Net ランタイム (CLR) 内で実行されることを意図した Assmebly です。

関連する質問で説明されているように、Com を介して公開できます: Ruby は .NET dll をインポートできますか? どれの

于 2013-01-16T19:47:01.133 に答える