2014-05-01 48 views
2

爲了避免爲電子表格的所有用戶註冊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做的事情?

感謝,

邁克

+0

我只有這樣才能使用C++而不是c#。如果有幫助,我可以發佈該代碼嗎? – steveo40

+0

從我的理解,在C++中,您可以使用__declspec(dllexport)聲明器,它更易於使用,但是由RGiesecke製作的DLLExport是C#的變通方法。我大概可以用C++重新編寫DLL,但是因爲如果我在Excel中包含一個引用,函數的工作方式就是這樣,我希望我的代碼中有一些小的語法問題,比在C++中重寫更容易。但也許它可能會有所幫助。 – IoTMike

回答

4

我是建設在設置爲「任何PC」,這顯然是不允許出口的類庫的屬性與目標平臺的解決方案。當我將它切換到「x86」時,它完全有效。

+0

很高興你解決了它。與Excel集成是一個真正的痛苦,尤其是部署。對於不需要實際Excel函數的東西,我傾向於在.Net中編寫一個小應用程序,然後使用Excel VBA編寫XML輸入文件,然後通過shell啓動應用程序,然後寫入XML輸出文件,然後被檢索到VBA中。這樣,我們不必實際安裝任何東西。 – steveo40