簡體   English   中英

在 C# COM-DLL 項目中使用外部 DLL 進行 MS-Access 使用

[英]Using external DLL's in C# COM-DLL project for MS-Access usage

用戶的主要應用是ms-access(使用ms-sql server)。 vba 中的大量代碼。 我必須展示的主要功能之一是控制我客戶的 voip 電話。 我的計划是制作一個 ms-access 可以使用的 COM DLL。

到目前為止,我已經設法編寫了一個 C# 項目(vs2019 .net 框架),它可以很好地處理 voip pbx,使用 json,並完成所有必要的任務,例如調用呼叫、發送短信、獲取呼叫列表、重新編碼列表,獲取錄音 wav 文件並將它們轉換為 mp3。 我使用 Newtopsoft.Json 和 NAudio.Lame。

但它只能作為獨立的 .net 項目或 exe 工作。 作為 COM DLL(類庫) - ms-access 可以處理和使用它,直到它到達代碼使用任何外部 dll 功能的部分 - 它崩潰(使用 newtonsoft)或只是不工作(使用 naudio),盡管dll 位於工作文件夾中。

我知道我必須找到一種方法讓這些外部 dll 在辦公室(32 位)環境下工作。 幾天來,我一直在嘗試和猜測許多代碼示例。 我試圖按照 Assembly.Load/From/File 示例動態加載和包含 dll,但我未能在我的代碼中吸收它,甚至無法充分理解它。

我希望我能在這里得到解決方案。 謝謝 :)

嗯,我能夠創建一個用於 Access 的 COM 對象。 當該類代碼用作 Access 的 COM 對象時,用於序列化數據的外部庫代碼(在我的例子中是 Newton soft)工作得很好。 您沒有提到其他庫是托管代碼還是外部win32 .dll? 然而,我已經將非托管的 .dll 與 .net COM 對象一起使用,然后從 MS-access 中使用了它。 唯一的問題是在項目資源管理器中,確保您有一個副本 local setting = true 用於外部引用的 .net .dll 庫。 (這是默認設置,所以我相信你會這樣做。當然,下一個問題當然是有沒有使用配置文件?(app.config)等?這樣做的原因當然是因為您的應用程序正在使用 msaccess.exe 啟動,那么配置和設置將被假定在 office 安裝文件夾中,而不是本地應用程序。因此,將這些 app.config 文件移動/復制到 office 文件夾並不是那么實用msaccess.exe 所在的位置。配置文件名不僅要在同一個文件夾中,還要命名。

Msaccess.exe.config。

代替

YourDotNet.exe.config

現在當然,如果您將項目構建為 .net exec? 那么當然任何配置設置(應用程序設置,而不是用戶)都將放置在此配置文件中,當然該文件必須與 .exe 文件放置在同一文件夾中。

因此,可以向您從 VBA 測試/調用的類添加一個“測試”函數(任何函數都是該類的方法),以確保可以看到和讀取此類設置(如果您正在使用任何設置)。

例如:

System.Reflection.Assembly.GetExecutingAssembly().Location + ".config"

因此,返回它以訪問並顯示此結果。

另一個問題當然是強制您的項目到 x86。 我不會使用“任何”CPU。 雖然這“可能”有效,但由於您使用的是 x32 訪問權限,因此我會強制將您的 .net 類編譯為 x86,而不是“任何”CPU。 如果將某些外部匯編與特定位大小進行比較,這也會產生一些錯誤,因此 x86 設置將導致您的類不使用某些外部 .net .dll。

現在您“注意到”您的項目作為 .exe 工作,然后“有點”作為一個類工作,而“.dll”注冊為 COM。

但是,您沒有提到如何將其從 .exe“翻轉”到類,或者您是否只是有一個作為 .exe 運行的 .net“測試”項目,它當然有對那個類.dll。 並且您不使用“COM”進行此測試。

如果您的 test.exe 程序可以使用該外部程序集?

然后我將創建一個 test2 項目,但這次不要引用程序集(作為 .net),而是嘗試使用 .net CreateObject()。 (我認為 c# 有這個選擇——vb.net 當然有)。

因此,您可以嘗試在此 .net 測試示例中使用 CreateObject(),從而從 .net 作為 COM 進行測試。

所以這個測試 .net 程序(一個沒有引用程序集的程序)將在你一路跳轉到 ms-access + VBA 測試代碼之前進行中間測試。

但是,我會首先測試/檢查這里是否使用了 app.config 文件,因為如上所述,當您翻轉到 COM 對象,然后在 Access/VBA 中創建該對象的實例時? 那么配置文件將不會被使用。 您可以在 .net 代碼中強制/更改該正在運行的程序集中的 app.config 文件,但我似乎找不到執行此操作的代碼示例。 但是在我們確認您在此處使用 app.exe.config 文件之前,我不會深入挖掘。

編輯

出於好奇,我用谷歌搜索了 naudio。 它是托管代碼。 所以,那個庫應該可以正常工作。 如果該項目被編譯為“任何 CPU”,您可以嘗試重新編譯為 x86,並將您的測試程序重新編譯為 x86。 然后,當您創建 COM 對象時,再次將其編譯為 x86。

如前所述,我為 ms-access 做了很多 COM 的東西,而且我毫無問題地使用 Newtonsoft(用於 jason 序列化/反序列化)作為 ms-access 使用的 COM 對象。

鑒於 naudio 是托管代碼,那么我不明白為什么會出現問題。 您在這里使用任何其他 3rd 方 .dll 嗎? 作為快速測試,我將所有項目設置為 x86。 您似乎“提到”COM 對象的“某些”有效,但不是全部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM