2017-03-06 93 views
0


現在我正在寫一個.net dll,它應該在VBA代碼(Excel,Access等)中可用。下面的設置工作正常:解決.net tlb參考

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
[Guid("8079e4a4-1e4b-4788-92ba-9d5b017fa9be")] //Allocate your own GUID 
public interface ICommunication 
{ 
    string TestProp { get; set; } 
    string Login(); 
    string Disconnect(); 
} 

[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("19fd86e2-f1b9-478c-ba7a-bd76bdf19b85")] //Allocate your own GUID 
[ProgId("TestDll.Communication")] 
public class Communication : ICommunication 
{ 
    public string TestProp { get; set; } 

    public string Login() 
    { 
     // use of BouncyCastle here 
     return "logged in"; 
    } 

    public string Disconnect() 
    { 
     // ... 
     return "disconnected"; 
    } 
} 

通過引用生成的TLB文件,我可以正常使用屬性藏漢斷開功能,但是調用登錄功能導致的問題(「找不到文件」消息框在Excel中),我猜與引用的BouncyCastle的用法有關。

Sub Button1_Click() 
    Dim o: Set o = CreateObject("TestDll.Communication") 
    Dim value As String 
    value = o.Login() 
    MsgBox value 
End Sub 

什麼是處理com可見庫內其他.net程序集引用的最佳方法?到目前爲止,我嘗試向GAC註冊bouncycastle,但沒有成功。

謝謝:)

+0

我的猜測是在'Login'方法中有某個異常發生,或者在JIT時間發生異常。爲了診斷這個問題,我建議:1)將'Login'方法的全部內容移動到一個輔助方法('private string LoginHelper(){...}')。 2)重寫'Login'方法在'try' /'catch'塊中調用你的助手。以某種方式記錄異常。 –

+0

在你的'Login()'方法中沒有看到代碼,作爲一個起點,你可以將它包裝在try/catch中並顯示一個包含任何異常細節的消息框。添加'使用System.Windows.Forms;'到你的類,並在你的方法'嘗試{你的代碼; } catch(Exception e){MessageBox.Show(e.ToString()); }'。除此之外,還可以創建一個WinForms或WPF應用程序作爲測試外殼,並提供可用於更好測試的方法副本。 – zaphodalive

回答

0

這確實是喜歡它無法讀取文件上面建議: 在每個版本我把一個.txt中讀運行該項目的bin目錄。 在我的解決方案中使用dll可以找到該文件,因爲相對路徑是我的bin目錄,但使用tlb時,相對根路徑是登錄的windows用戶的文檔文件夾。

有趣的是,我認爲整個過程中錯誤與我設置我的DLL的方式有關,如com的可見:)。