- PR -

C#で作成したdllをrubyから呼ぶ方法について

1
投稿者投稿内容
rbdream
会議室デビュー日: 2009/02/23
投稿数: 3
投稿日時: 2009-02-23 16:54
下記のとおり、C#で作成したdllをrubyから呼び出した時、「unknown symbol"GetMsgInfoStr"」とのエラーが出てきてしまいました。
ご教授、宜しくお願い致します。

----C#のソース----------
using System;
using Microsoft.Win32;

namespace GetMsgInfoStr
{
public class MsgInfoStr
{
public static int GetMsgInfoStr(string str)
{
long ret = 0;

Console.WriteLine("Hello " + str);
return ret;
}
}
}
----C#のソース----------

◆コンパイル 
c:\work\GetMsgInfoStr>csc /target:library /out:MsgInfoStr.dll MsgInfoStr.csc

◆生成したMsgInfoStr.dllをC:\WINDOWS\system32配下にコピーしておきます。

----rubyのソース----------
require 'dl/win32'
require 'Win32API'

calss MsgInfoController < ApplicationControler
.....略
def disp
...
t = Win32API.new('MsgInfoStr.dll', 'GetMsgInfoStr', %w(p), 'l')
t.call('World')
...
end
.....略
end
----rubyのソース----------

t = Win32API.new('MsgInfoStr.dll', 'GetMsgInfoStr', %w(p), 'l')実行時、「unknown symbol"GetMsgInfoStr"」のエラーが発生しました。


質問1:ご存知のとおり、dllは下記の3種類があります。
1. Win32 の DLL
2. ActiveX DLL(COM)
3. マネージド DLL(.NET)
上記の方法で、生成したC#のMsgInfoStr.dllが何のDLLでしょうか?

質問2:エラー発生の要因は何ですか?
    具体的な退避方法をご教授をお願い致します。

注:上記の同じな方法で、rubyからWin32の標準dll(例user32.dll)を呼び出した時、正常に実行できることを確認しました。

どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2009-02-23 17:03
C#で作成した、というか.NET Frameworkで作成したdllは必ず3番のマネージドdllになります。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2009-02-23 23:46
マネージコードで作られたDLLを何の加工(工夫)もない状態で、アンマネージなコードから直接呼ぶことはできません。
考えられるのは下記のような手かなぁ。

1.C#側のコードをCOMとして公開できるように組み上げて、RubyからCOMとして呼び出す。C#側もRuby側も変更が必要。
2.C++/CLIで一般的な関数エクスポートを提供しつつ、C#のDLLにアクセスできるようなラッパーを作る。Rubyでの呼び出しコードはあんまり変わらないが、C++/CLIという新たな領域に踏み出す必要がある。
3.IronRuby。Ruby自体をマネージコードとして実行する。やりたいこと次第では採用できないかもしれない。
rbdream
会議室デビュー日: 2009/02/23
投稿数: 3
投稿日時: 2009-02-24 09:21
Azulean殿

ご教授、有難うございます。
結構参考となります。

私、C#/C++とrubyの未熟者のため、アドバイスの1と2について、お手数ですが、お時間が御座いましたら、実現のサンプルを頂きたいと思っております。宜しくお願い致します。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2009-02-25 01:08
残念ながら平日にそこまでの時間は取れません。

1.
C# ComVisibleあたりで検索してみると色々と引っかかるかもしれません。
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&num=50&q=C%23+ComVisible
他にもCodeProjectとかも。
http://www.codeproject.com/KB/cs/ManagedCOM.aspx

2.
C++/CLIに馴染んでおく。
CLRクラスライブラリプロジェクトで、ネイティブの関数エクスポートを書く要領で関数を作っておき、その中でC#のクラスにアクセスする。
C#のDLLへの参照設定もしておく必要あり。
rbdream
会議室デビュー日: 2009/02/23
投稿数: 3
投稿日時: 2009-02-25 14:42
ご回答、有難う御座います。

調べる限り、実現方法はなかなか把握できませんでした。
これについて、有知者達から簡単なサンプルでご教授を頂くようお願い致します。
セラフ
ベテラン
会議室デビュー日: 2005/12/01
投稿数: 95
お住まい・勤務地: 東北の顔の形といえば
投稿日時: 2009-02-25 15:46
rubyからActiveX DLL(COM)を使用する方法はわかりますね?
http://jp.rubyist.net/magazine/?0003-Win32OLE

あとは、C#側でCOMとして実行できる工夫を入れておけばいいだけです。
http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.comvisibleattribute.aspx

http://msdn.microsoft.com/ja-jp/library/sd10k43k.aspx

引用:
調べる限り、実現方法はなかなか把握できませんでした。
これについて、有知者達から簡単なサンプルでご教授を頂くようお願い致します。


↑こういう「考えるの面倒くさいからソースください」っと取れる発言は嫌われるので辞めたほうがいいと思います。

「○○だと思ったので、こういうソースを書きましたが、○○がうまくいかないので教えてください。」っといった感じで必死に考えた過程を提示されない限り、ほんとに調べたの?っと私などは思ってしまいます。

[ メッセージ編集済み 編集者: セラフ 編集日時 2009-02-25 15:52 ]
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2009-02-25 23:19
引用:

調べる限り、実現方法はなかなか把握できませんでした。


どこまで分かって、どこが分からないかを述べて下さい。
それに対して、アドバイスできる可能性はあります。

引用:

これについて、有知者達から簡単なサンプルでご教授を頂くようお願い致します。


「サンプル以外はいりません」宣言にも見えますが、その姿勢だと伸び悩みます。
難しいことをやるときは確かにサンプルがあると理解が早いとは思いますが、調査したり、試行錯誤したりすることも重要です。
1

スキルアップ/キャリアアップ(JOB@IT)