感謝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執行結果:
參考資料: