2016-12-14 87 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並創建了以下ruby代碼:

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>' 

上什麼,我在這裏錯過了有什麼想法?

編輯

檢查之後,如果我的DLL是根據this SO question, 寄存器看來,的確是我的DLL被註冊了,不過,同樣的錯誤發生。

在這裏真的很困惑......

回答

1

被標記標記有ComVisible特性只有課程將在註冊過程中導出到適當的鍵。這也是一個非常非常好的主意(我強制要求)有一個Guid屬性,而不是採用在每次編譯期間都可以更改的默認屬性。你也可以有你自己的ProgId屬性,但是Namespace.ClassName的缺省值通常是足夠的(其中Namespace是你的類所在的命名空間,而ClassName是你的類的名字)。

試試這個:

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); 
      } 
     } 
    } 
} 

這是我從.NET方面看。我沒有任何嘗試從Ruby使用的經驗。

如果您的Ruby進程是32位的,它也將有所幫助。 VIsual Studio通常只在64位操作系統上使用32位運行時系統註冊該類。

對於IDE之外獨立註冊,使用類似:

regasm.exe /tlb /codebase YourDll.dll 

確保您使用regasm.exe正確的.NET運行時,正確的六十四分之三十二位的味道。

如果您的DLL註冊與COM正確,它應該可以通過VBScript調用。做一個簡單的VBScript名爲Test.vbs:

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

如果您在文件名上雙擊,在資源管理器或只需鍵入命令行外殼test.vbs它會嘗試用WScript.exe在運行VBS程序C:\ WINDOWS \ SYSTEM32 \ WScript.exe的。

它可能會在64位操作系統上失敗,因爲默認情況下,VS只爲32位子系統註冊.NET程序集。要嘗試在32位子系統上運行它,請嘗試:

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

如果其中任一方法失敗,那麼您的DLL未正確註冊。

+0

感謝您的答案joe,幾件事情: 1)[assembly:ComVisible(false)]可能在AssemblyInfo.cs文件中,並且會使我的項目中的所有類com都可見(我已配置此設置)。 2)我需要了解,如果它是通過VS15註冊的,這是否意味着這個DLL可以通過整個操作系統?還是隻在VS15目錄中「活着」? – Itzik984

+0

COM中必需的註冊表項將在整個操作系統中假設您將VS作爲高級管理員運行。 快速伎倆,以測試它是否工作就是寫一個VBS腳本: '昏暗obj' '設置OBJ =的CreateObject( 「ComLIb.LogWriter」)' 'MSGBOX類型名(OBJ)' 遇到問題... 通過C運行:\ WINDOWS \ SYSTEM32 \ WScript.exe的 並運行它通過C:\ WINDOWS \ SYSWOW64 \ WScript.exe的 默認情況下,它應該與一個在SYSWOW64目錄成功。這會告訴你它是否正確註冊。 –

+0

好的,再次感謝......仍然不知道這裏發生了什麼問題。好像我在做我應該做的一切。 – Itzik984

0

解決了它,看起來似乎是一個相當奇怪的解決方案。

改變了這個:

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

要這樣:

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

和一切工作。