爲了避免爲電子表格的所有用戶註冊Dll,我試圖使用遲綁定,以便用戶不需要添加對Dll的引用。使用DllExport的C#DLL:在VBA中調用時沒有入口點
我用Visual Studio創建了C#中的Dll,儘管我已經包含了「使用RGiesecke.DllExport;」並在函數上使用DllExport返回一個包含我需要在VBA中訪問的函數的對象時,仍然收到錯誤「運行時錯誤'453':無法找到DLL入口點CreateDotNetObject in C:\ temp \ 。MyFunctions.dll「
該DLL的代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Data;
using System.Text.RegularExpressions;
using Microsoft.TeamFoundation.Client;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections;
using System.Collections.ObjectModel;
using System.Threading;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.Framework;
using Microsoft.TeamFoundation.Common;
using Microsoft.VisualBasic;
using System.Diagnostics;
using RGiesecke.DllExport;
namespace MyFunctions
{
public interface IMyFunctions
{
string GetWorkItemLinkList(string WIIDs);
}
[CLSCompliant(true), ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class MyFunctions : IMyFunctions
{
TfsConfigurationServer server;
WorkItemStore store;
private void TFSconnect()
{
//Code to connect
}
[CLSCompliant(true), ComVisible(true), Description("GetWorkItemLink func")]
public string GetWorkItemLink(int WIID)
{
TFSconnect();
//Code to build return string "message"
return message;
}
[CLSCompliant(true), ComVisible(true), Description("GetWorkItemLinkList func")]
public string GetWorkItemLinkList(string WIIDs)
{
TFSconnect();
//Code to build return string "returnStr"
return returnStr;
}
}
static class UnmanagedExports
{
[DllExport]
[return: MarshalAs(UnmanagedType.IDispatch)]
static Object CreateDotNetObject()
{
return new MyFunctions();
}
}
}
和VBA的聲明如下:
Private Declare Function CreateDotNetObject Lib "c:\temp\MyFunctions.dll"() As Object
但是當我嘗試實例化n對象,我得到上面提到的錯誤。
Sub test()
Dim o As Object
Set o = CreateDotNetObject()
End Sub
這是我第一次嘗試在Excel中使用自定義dll函數,而無需在VBA中添加引用。如果我添加一個引用(早期綁定),這些函數就可以工作,但是這個DLL不會傳播給所有使用電子表格的人,而且我需要它在運行正常函數時不會崩潰。
編輯:其他信息。我只注意到,除了DLL之外,當我在Visual Studio中構建解決方案時,我還獲得了「Object FileLibrary」和「Exports Library File」。當我註冊DLL時,有沒有我應該用.exp或.lib做的事情?
感謝,
邁克
我只有這樣才能使用C++而不是c#。如果有幫助,我可以發佈該代碼嗎? – steveo40
從我的理解,在C++中,您可以使用__declspec(dllexport)聲明器,它更易於使用,但是由RGiesecke製作的DLLExport是C#的變通方法。我大概可以用C++重新編寫DLL,但是因爲如果我在Excel中包含一個引用,函數的工作方式就是這樣,我希望我的代碼中有一些小的語法問題,比在C++中重寫更容易。但也許它可能會有所幫助。 – IoTMike