2015-10-25 20 views
0

我想從腳本中構建一個簡單的VB.NET COM可見DLL(我希望它可以在未註冊的情況下訪問)。 vb的文件是簡單得要命:如何從腳本構建COM可見DLL?

Imports System.Runtime.InteropServices 
Imports RGiesecke.DllExport 

Public Module Test 
    <DllExport("add")> _ 
    Public Function TestExport(left As Integer, right As Integer) As Integer 
     Return left + right 
    End Function 
End Module 

當通過棟Visual Studio的UT,並試圖從Excel訪問DLL:

Public Declare Function add Lib "C:\\...\\VBLib.dll" (left As Integer, right As Integer) As Integer 

它的工作原理,並提供正確的結果。但是,當我嘗試用腳本組裝DLL時,出現錯誤:Can't find DLL entry point

這裏是我使用的腳本:

  1. 首先我運行VBC編譯器:

vbc.exe /noconfig /imports:Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Data,System.Diagnostics,System.Linq,System.Xml.Linq,System.Threading.Tasks /optioncompare:Binary /optionexplicit+ /optionstrict:custom /nowarn:42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 /optioninfer+ /nostdlib /platform:x86 /rootnamespace:VBLib /sdkpath:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5" /highentropyva+ /reference:"C:\...RGiesecke.DllExport.Metadata.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.DataSetExtensions.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /out:"C:\...\VBLib.dll" /subsystemversion:6.00 /target:library Class1.vb

  • 然後我跑ILDASM .exe
  • "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe" /quoteallnames /unicode /nobar /out:"C:\...\VBLib.il" "C:\...\VBLib.dll"

  • 並且最後我運行ILAsm.exe
  • "C:\Windows\Microsoft.NET\Framework\v4.0.30319\ILAsm.exe" /nologo /out:"C:\...\VBLib.dll" "C:\...\VBLib.il" /DLL /resource="C:\...\VBLib.res" /optimize

    我複製上述過程幾乎一字從Visual Studio生成(詳細視圖),它們都運行W/O錯誤產生一個DLL。但是,我仍然得到上面的錯誤。 在任何情況下,如果有一個更短的工作腳本來從單個VB.NET文件提供COM可見的DLL,我將非常感謝!

    注:文件路徑已經縮短...

    +0

    也許[<標記有ComVisible特性(真)> _](https://msdn.microsoft.com/en-us/ library/system.runtime.interopservices.comvisibleattribute(v = vs.100).aspx)屬性 –

    +0

    不可以。試過了。 –

    +2

    這與COM沒有任何關係。吉塞克的效用是一個IL重寫工具。你經歷了所有的步驟,除了照顧重寫。您必須使用未記錄的.export指令。對此沒什麼意義,它在任何方面都不是「更好」。如果你想在一步之內完成而不需要構建或重寫黑客,那麼你必須使用[C++/CLI語言](http://stackoverflow.com/a/17131801/17034)。 –

    回答

    0

    發現了一種通過ExportDLL.exe文件從this article做到這一點。 所有我需要做的是:

    1. 修改源代碼,如下圖所示,

    2. 導入ExportDllAttribute.dll到項目使用ExportDLL ATTRIB

    3. 生成DLL與VBC.exe爲如上所述

    4. 使用ExportDLL導出DLL。exe文件經由:

    ExportDll.exe full_path_to_yours_dll\yoursdll.dll

    修改源代碼:

    Imports System.Runtime.InteropServices 
    Imports ExportDllAttribute 
    
        Public Module Test 
         <ComVisible(True)> _ 
         <ExportDll("TestExport", System.Runtime.InteropServices.CallingConvention.Cdecl)> _ 
         Public Function TestExport(left As Integer, right As Integer) As Integer 
          Return left + right 
         End Function 
    
    End Module