2013-01-16 50 views
3

我想讓我的第一個C#DLL。 我想能夠通過win32API從ruby中調用它的方法/函數。 我有此DLL:創建一個簡單的C#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不好嗎?

問候,

+0

側邊欄:DLLEXPORT是窗戶的早期C /帕斯卡時期設想一個目錄機制。它是如何使用它的完整說明在這裏:http://msdn.microsoft.com/en-us/library/z4zxe9k8%28v=vs.110%29.aspx – meklarian

回答

2

沒有做任何額外的東西,創造了DLL旨在.NET運行時(CLR的)內部運行的Assmebly。 Can Ruby import a .NET dll?

+0

我完全沒有經驗的DLL的。什麼樣的DLL可用於win32API?而且,你知道這些教程嗎?使用win32ole不是我希望它工作的方式...... – KenGey

3

爲使用來自作爲一個Win32方面所做的DLL函數,這些函數必須出口,可見從DLL:

可以作爲相關的問題描述通過COM揭露它。這些函數通常會標記爲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