iInfo 資訊交流: .NET C# 建立 COM元件 (5) --- UnManaged Exports dll

最新消息

[公告2014/05/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2017/02/20] 近來有網友詢問 MultiCharts 與 Excel 畫冰火能量圖 (8)MultiCharts 與Excel 畫冰火能量圖(11) --- 更名「台股儀表板」 文章中教學檔案取得方式,有興趣的朋友可透過 Line了解詳情 (請勿以為是免費分享),Line : aminwhite5168。

[公告2018/04/22] 台北 Python + Excel VBA 金融資訊爬蟲課程,課程如網頁內容 金融資訊爬蟲班:台北班 Python 金融資訊爬蟲、EXCEL VBA 金融資訊爬蟲,請盡快把握機會,歡迎券商、大專院校邀約講座。

[公告2018/06/01] 台指能量儀表板教學課程,課程如網頁內容 台北班:台指能量儀表板

[公告2018/10/02] 期交所於2018/10/03進行網址改版,若有參考部落格與期交所相關文章,請各位讀者自行修改。

2017年2月13日 星期一

.NET C# 建立 COM元件 (5) --- UnManaged Exports dll

如果要將C#函數輸出成可讓C++使用Loadlibrary方式呼叫的DLL,稱為Unmanaged Export dll,反之稱為Managed dll,至於什麼是Managed/Unmanaged呢?
感謝iInfo群Neil (承諺)大大的協助,才能順利完成。
泛指基於.NET framework 平台所開發的程式,且能被 CLR (Common Languages Runtime) 的管理,稱為Managed。
有一些資源是由系統的 API 或其他的 API 控制的,例如 Windows Handle,這類的資源是由 Native Code 程式碼( 比方 C++ Win32 或 MFC 形式的專案,VB6 的專案) 分配的,就稱為 Unmanaged,因為 CLR 無法管理這類資源。
筆者需要能透過C#取得資訊,又需要能讓Excel VBA或VC++直接呼叫,因此將 C# 函數以 Unmanaged 方式輸出。
.NET C# 建立 COM元件 (4) --- VC++呼叫COM元件函數 文章,所提的C#範例程式修改來作範例。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;

namespace TestVBA
{
    class VBAFunc 
    {
        [DllExport]
        //[DllExport("Multiply", CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.AnsiBStr)]
        static String Multiply(int a, int b)
        {
            return (a * b).ToString();
        }
    }
}
Excel VBA程式碼:
Declare Function Multiply Lib "C:\Code\TestVBA\TestVBA\bin\x86\Release\TestVBA.dll" (ByVal a As Integer, ByVal b As Integer) As String
Sub test()
 MsgBox Multiply(2, 3)
End Sub
或是以下寫法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;

namespace TestVBA
{
    class VBAFunc 
    {
        [DllExport]
        //[DllExport("Multiply", CallingConvention = CallingConvention.StdCall)]
        //[return: MarshalAs(UnmanagedType.AnsiBStr)]
        static int Multiply(int a, int b)
        {
            return a * b;
        }
    }
}
Excel VBA程式碼:
Declare Function Multiply Lib "C:\Code\TestVBA\TestVBA\bin\x86\Release\TestVBA.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
Sub test()
 MsgBox Multiply(2, 3)
End Sub 
上述C#程式需安裝UnmanagedExports套件,請讀者使用 NuGet (VS2010) 安裝 (VS2012以上版本已含內建程式,無須安裝NuGet)。
Install-Package UnmanagedExports
執行結果:

參考資料: