用户的主要应用程序是ms-access(使用ms-sql服务器)。 VBA中的代码吨。 我必须表现出的主要功能之一是控制客户的voip电话。我的计划是制作一个ms-access可以使用的COM DLL。
到目前为止,我设法编写了一个C#项目(vs2019 .net框架),该项目使用json很好地处理了voip pbx,并完成了所有必要的任务,例如调用电话,发送短信,获取电话列表,录音列表,获取录音的wav文件并将其转换为mp3。我使用的是Newtopsoft.Json和NAudio.Lame。
但是,它只能作为独立的.net项目或exe。 作为COM DLL(类库),ms-access可以处理和使用它,直到它到达代码使用任何外部dll功能的部分为止,并且它崩溃(与newtonsoft)或只是不起作用(与naudio),尽管dll位于工作文件夹中。
我知道我必须找到一种使这些外部dll在办公室(32位)环境下工作的方法。 我尝试并猜测了几天的许多代码示例。我尝试遵循Assembly.Load / From / File示例来动态加载并包含dll,但是我未能将其吸收到我的代码中,甚至无法充分理解它。
我希望我能在这里找到解决方案。 谢谢:)
答案 0 :(得分:0)
哼,我能够创建一个与Access一起使用的COM对象。当该类代码用作Access中的COM对象时,用于序列化数据的外部库代码(在我的情况下为Newton soft)可以正常工作。 您没有提到其他库是托管代码还是外部win32 .dll?但是,我将非托管.dll与.net COM对象一起使用,然后从MS-access中使用了该对象。 唯一的问题将在项目资源管理器中,以确保您具有外部引用的.net .dll库的本地副本设置= true。 (这是默认设置,所以我敢肯定。 当然,下一个问题当然是使用配置文件吗? (app.config)等?当然,这样做的原因是,由于您的应用程序是使用msaccess.exe启动的,因此将假定配置和设置位于Office安装文件夹中,而不是本地应用程序中。结果,将这些app.config文件移动/复制到msaccess.exe所在的office文件夹并不是很实用。配置文件名不仅必须位于同一文件夹中,而且还必须命名。
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,然后“ sort of”用作类,而“ .dll”注册为COM。
但是,您没有提到如何将其从.exe“翻转”到类中,或者您只是拥有一个以.exe运行的.net“测试”项目,并且它当然具有对该类.dll的引用。而且您不使用“ COM”进行此测试。
如果您的test.exe程序可以使用该外部程序集?
然后我将创建一个test2项目,但是这次不引用程序集(如.net),而是尝试使用.net CreateObject()。 (我认为c#可以选择-vb.net当然可以。)
因此,您可以尝试在此.net测试示例中使用CreateObject(),然后从.net作为COM进行测试。
因此,在您完全进入ms-access + VBA测试代码之前,此测试.net程序(未引用程序集的程序)将是一个中间测试。
但是,由于要翻转到COM对象,然后在Access / VBA中创建该对象的实例时,我会首先测试/检查此处是否正在使用app.config文件? 然后将不使用配置文件。您可以在.net代码中强制/更改该正在运行的程序集中的app.config文件,而我似乎找不到执行此操作的代码示例。但是,直到我们确认您在这里使用的是app.exe.config文件时,我才开始进行深入研究。
出于好奇,我用Google搜索了naudio。它是托管代码。因此,该库应该可以正常工作。如果该项目被编译为“ ANY CPU”,则可以尝试将其重新编译为x86,也可以将测试程序重新编译为x86。然后,当您创建一个COM对象时,再次将其编译为x86。
如前所述,我为ms-access做了大量COM事务,并且毫无问题地将Newtonsoft(用于jason序列化/反序列化)用作由ms-access消耗的COM对象。
考虑到naudio是托管代码,那么我不明白为什么这会成为问题。您在这里使用其他任何第三方.dll吗?作为快速测试,我将所有项目设置为x86。您似乎在“提及” COM对象的“某些”有效,但并非全部。