2017-03-16 47 views
0

我正在爲Navision 2009 SP1(經典客戶端)開發一個報告,其中需要額外的功能在NAV中不可用。Navision C/AL用C#創建錯誤DLL dl

我已經在C#中創建了一個COM DLL,安裝它(使用InstallShield「免費」vs版本)並在NAV中創建了一個自動化變量。類和接口是可見的,我看到Print方法,但是當我嘗試創建變量時,出現以下錯誤:

「無法創建由...標識的OLE控件或自動化服務器的實例...檢查OLE控件或自動化服務器是否已正確安裝並註冊。「

這是代碼(只是想獲得一個連接會):

[ComVisible(true), Guid("080a97fb-321c-4a2f-b948-dd52ce263415"), InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IPrinterTest 
{ 
    [DispId(1)] 
    bool Print(string test, string bytesInStringRepresentation); 
} 

[ClassInterface(ClassInterfaceType.None), ComVisible(true), Guid("8d7b85a9-1a20-4ea0-a7d4-decf26632eee"), ProgId("Printer.PrinterTest")] 
public class PrinterTest : IPrinterTest 
{ 
    public PrinterTest() 
    { 

    } 

    public bool Print(string test, string bytesInStringRepresentation) 
    { 
     return true; 
    } 
} 

生產環境只有.NET Framework Client Profile受(3.5和4.0),這意味着Regasm可用(在4.0 )而且gacutil不是。

我假設我的代碼有問題,而不是InstallShield,因爲dll可以在Navision中進行選擇,並且當我嘗試創建導航自動化變量時出現此問題。

問候 馬庫斯

+0

我不明白在這裏投下的投票文化,我真的不知道。如果您覺得我的問題不能令人滿意,爲何不在評論中告訴我爲什麼?如果你不讓我知道我做錯了什麼,我無法改善。 – Starwop

+0

錯誤發生在'CREATE(NameAutomationVariable)'行中? –

+0

是的,當我做「CREATE(NameAutomationVariable)」時發生錯誤。如果我使用CREATE的結果,它總是返回false。 – Starwop

回答

0

好了,所以沒有什麼錯與上面的代碼,顯然Visual Studio中也有一個安裝程序的工具集。

我創建了一個新的解決方案,重新創建了庫項目並添加了VS安裝程序項目,而不是InstallShield項目。我確信庫程序集簽名很強,並且我在安裝程序項目的「FileSystem」中添加了一個TLB文件。安裝程序項目會自動將TLB文件註冊爲依賴項,因此TLB文件可以在之後從「文件系統」中刪除。

使用該設置,我能夠正確註冊用於COM互操作的DLL。

記住所以關鍵點是:

  • 如果你有相同的設置怎麼辦?(接口和類),確保兩人都標記有ComVisible特性和公衆。此外,它們需要具有匹配的名稱,例如「IPrinterTest」&「PrinterTest」。
  • 確保組件簽名強。
  • 您必須爲該DLL生成一個TLB文件並將其添加到安裝程序「FileSystem」中。

我會稍後編輯這個答案,詳細介紹整個過程。