2016-12-14 5 views
0

からdllをロードできません:、私はこの質問で説明する手順に従ってきた.NETがルビー

Can Ruby import a .NET dll?

だから、私はこのC#のコードがあります。解決策の下

using System; 
using System.IO; 

namespace ComLib 
{ 
    public class LogWriter 
    { 
     public void WriteLine(string line) 
     { 
      using (var log = new StreamWriter(File.OpenWrite(@"c:\log.file"))) 
      { 
       log.WriteLine(line); 
      } 
     } 
    } 
} 

RubyToCSharp

私はVSでRegister for COM interopを確認し、次のルビーコードを作成しました:

require "win32ole" 

lib = WIN32OLE.new('RubyToCSharp.ComLib.LogWriter') 
lib.WriteLine('calling .net from ruby via COM, hooray!') 

そして今、私はPowerShellのからこのルビーを実行しようと、私はこのエラーを取得しておいてください。私はここをかけて行方不明です何に

./exmpl.rb:4:in `initialize': unknown OLE server: `RubyToCSharp.ComLib.LogWriter' (WIN32OLERuntimeError) 
    HRESULT error code:0x800401f3 
     Invalid class string 
     from ./exmpl.rb:4:in `new' 
     from ./exmpl.rb:4:in `<main>' 

任意の考え?

EDIT

私のdllがthis SO questionによるレジスタ、 だったかどうかをチェックした後に確かに私のDLLが登録されているようですが、それでも、同じエラーが発生します。こちらに本当に混乱し

...のComVisibleをマークされている

答えて

1

のみのクラスは、登録時に適切なキーにエクスポートされます。すべてのコンパイル時に変更できるデフォルトを取るのではなく、Guid属性を持つことも非常に良い考えです(私は必須です)。独自のProgId属性を持つこともできますが、多くの場合、Namespace.ClassNameのデフォルト値で十分です(Namespaceはクラスの名前空間、ClassNameはクラス名です)。

これを試してみてください:

私は、.NET側から見たものです
using System; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace ComLib 
{ 
    [ComVisible(true)] // needs to be marked ComVisible 
    [Guid("ad4c28c9-4612-4ac3-8ca4-04a343f4f2b9")] // generate your own 
    public class LogWriter 
    { 
     public void WriteLine(string line) 
     { 
      using (var log = new StreamWriter(File.OpenWrite(@"c:\log.file"))) 
      { 
       log.WriteLine(line); 
      } 
     } 
    } 
} 

。私はRubyから消費しようとする経験はありません。

Rubyプロセスが32ビットの場合にも役立ちます。 VIsual Studioは、一般的に、64ビットOS上の32ビットランタイムシステムのみでクラスを登録します。あなたは正しい.NETランタイムと正しい64分の32ビットの味のためにRegasm.exeによってを使用していることを確認してください

regasm.exe /tlb /codebase YourDll.dll 

:IDEの外のスタンドアロン登録については

は、のようなものを使用します。

DLLがCOMに正しく登録されている場合は、VBScript経由で呼び出し可能にする必要があります。 Test.vbsを呼ばれる簡単なVBScriptを行います

Dim obj 
set obj = CreateObject("ComLib.LogWriter") 
MsgBox TypeName(obj) 

場合、ファイル名をダブルクリックし、エクスプローラまたは単にコマンドラインからTest.vbsというそれはwscript.exeと中にVBSプログラムを実行しようとするシェルタイプc:\ windows \ system32 \ wscript.exe。

デフォルトでは、VSはCOMの.NETアセンブリを32ビットサブシステムに登録するだけなので、おそらく64ビットOSで失敗します。

c:\windows\syswow64\wscript.exe test.vbs 

これらの方法のいずれかが失敗した場合、DLLは正しく登録されません。

+0

私は、プロジェクトのところで、AssemblyInfo.csファイルに[assembly:ComVisible(false)]があり、すべてのクラスを表示するように設定しています。 2)VS15を介して登録されている場合、これはこのDLLがOS全体を通して利用可能であることを意味するのでしょうか?それともVS15 DIRだけで「生きている」のですか? – Itzik984

+0

昇格された管理者としてVSを実行していると仮定すると、COMに必要なレジストリ内のエントリは、OS全体になります。 それが働いているかどうかをテストするための迅速なトリックは、VBSスクリプトを書くことです: 'obj'暗く '設定OBJ =のCreateObject( "ComLIb.LogWriter") ' ' MsgBoxに型名(OBJ) ' トラブルを有するCを経由して... 実行して:\ WINDOWS \ SYSTEM32 \ wscript.exeとし、Cを経由して、それを実行します。デフォルトでは wscript.exeと\ WINDOWS \ SYSWOW64 \それはSYSWOW64ディレクトリ内のいずれかで成功する必要があります。これは、それが正しく登録されているかどうかを伝えます。 –

+0

もう一度感謝します...ここで間違っていることはまだ分かりません。私のようにすべてをやっているようです。 – Itzik984

0

解決したのはむしろ奇妙な解決策であるかもしれません。これに

lib = WIN32OLE.new('RubyToCSharp.ComLib.LogWriter') 

は、この変更

lib = WIN32OLE.new('ComLib.LogWriter') 

を、すべてが働きました。

関連する問題