从 VB.Net DLL 引用 DLL

Posted

技术标签:

【中文标题】从 VB.Net DLL 引用 DLL【英文标题】:Referencing DLLs from a VB.Net DLL 【发布时间】:2021-11-30 04:31:21 【问题描述】:

我有一个我正在尝试测试部署的 Visual Studio 解决方案。该解决方案中有多个项目,并引用了 .Net 框架和其他地方的许多不同组件。我的所有组件都在 C# 中,除了一个在 VB.Net 中的组件(将在某个时候升级,但需要一次性完成并且很大)。

项目结构为:

在我的开发机器上一切正常。但是,当我部署到测试机器(即 Windows 10 + 更新)并且故意没有互联网连接(有效测试)时,我在 Dolphin 组件中运行部分程序时遇到问题。

测试机上的代码错误是:

oValue = New SqlGeometry() <-- this does not error
oValue.Parse("LINESTRING (100 100, 20 180, 180 180)") <--- this errors

错误是:

试图加载格式不正确的程序。 (HRESULT 异常:0x8007000B)

我希望在 AppData 和 AppBuilder 中使用 SqlGeometry 和 SqlGeography。我在 EXE 和 DLL 所在的文件夹中同时拥有 SqlServerSpatial110.dll 和 Microsoft.SqlServer.Types.dll。

如果我尝试在 Dolphin (VB.Net) 中添加对 SqlServerSpatial110.dll 的引用,我会收到以下错误消息,指出无法完成:

如果我尝试使用 regsvr32 从目标应用目录中手动在测试机器上注册 SqlServerSpatial110.dll,我会收到错误消息:

模块“SqlServerSpatial110.dll”加载失败。

确保二进制文件存储在指定路径或调试到 检查依赖 .DLL 文件的二进制文件是否存在问题。

找不到指定的模块。

SqlServerSpatial110.dll 在我的开发机器上的 System32 目录中,但不在测试机器上。我在编写清单文件方面的经验水平根本没有,我希望能保持这种状态。作为参考,我使用了一个名为 DeployMaster 的部署产品,但这与问题无关。所有组件都设置为 x86 编译。这是一个winforms应用程序

简而言之,如何从 Dolphin 引用 SqlServerSpatial110.dll 以使其正确部署和使用?

【问题讨论】:

这能回答你的问题吗? System.DllNotFoundException: Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found 这能回答你的问题吗? Unable to load SqlServerSpatial.dll @GSerg - 我之前已经阅读了这两个链接,但不确定如何将它们应用于 winforms 应用程序的部署。第一个链接与 web.config 文件和 nuget 相关,我都没有使用它们,第二个链接与 IIS 服务器上的 WCF 相关。第一个看起来更有希望,但我不希望最终用户使用 nuget,这是该解决方案所暗示的。 您应该正确地重新分发您的库。您的安装项目必须设置它们,或者用户必须单独安装它们,***.com/q/29143630/11683 “格式不正确”错误表明您可能遇到 32 位与 64 位问题。 【参考方案1】:

我认为这与 c# vs VB.Net 没有太大关系,一旦构建应该只有 .Net 程序集,并且使用什么语言无关紧要。

正确的解决方案应该是为需要此程序集的项目注册对 Microsoft.SqlServer.Types 的 nuget 依赖项。 IE。转到“Tools\Nuget Package Manager\Manage packages for solution”并在你的dolphin项目中安装上面的包。

这应该确保从 Internet 下载所需的 dll 并将其复制到您的输出目录,但如果您使用任何类型的安装框架,您可能需要手动包含它。

【讨论】:

【参考方案2】:

我找到了解决办法。这是winforms的解决方案。我只在网上看到过 Azure 或 WFC 或 asp.net 的解决方案,因此希望这可以作为其他人的指南。它要求解决方案中的所有项目都是 64 位的,但对我来说这没问题。我采取的步骤是:

将所有项目更改为 x64 使用 nuget 将 Microsoft.SqlServer.Types 添加到解决方案中涉及 SQL 空间类型的所有项目。 在 app.config 中,包括以下内容:
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
在代码的早期,在应用程序中,在需要任何 SQL 空间类型之前,执行以下代码(这是安装包后显示的自述页面底部 nuget 建议的代码):
using System.Reflection;
...
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
在您的安装软件中,确保将 &lt;yourexename&gt;.exe.config 部署到 %APPFOLDER%(您的应用部署到的文件夹)。 另外,在 %APPFOLDER% 中包含文件:Microsoft.SqlServer.Types.dll 另外,在 %APPFOLDER% 中,您需要以下结构(您应该可以从项目文件夹中复制该结构):
%APPFOLDER%\Microsoft.SqlServer.Types.dll (14.0.1016.290)
%APPFOLDER%\SqlServerTypes\x64\msvcr120.dll (12.0.40649.5)
%APPFOLDER%\SqlServerTypes\x64\SqlServerSpatial140.dll (14.0.1016.290)

但是,我还发现 Visual Studio 在使用 64 位类库中的 UserControl 时存在问题。这样做的症状是项目构建没有错误,但是如果您尝试打开一个带有 64 位 UserControl 的表单,它将显示错误。

要解决此问题,请使用配置管理器并将调试配置设置为 32 位,将发布设置为 64 位。在 Debug 配置中开发并在 (uh) Release 配置中发布。

如果有人调整有关 32 位 DLL 的构建和位置的分辨率,这对我很有用,所以请在下面发布它或链接。谢谢。

【讨论】:

以上是关于从 VB.Net DLL 引用 DLL的主要内容,如果未能解决你的问题,请参考以下文章

vb.net把dll放到程序的Resources资源里面,能直接调用Resources里面的dll吗?

VB .NET 制作的DLL无法被 .NET 程序引用

.net中如何引用Dll文件?

创建 VB.NET COM DLL

vb.net 如何引用自定义类库

在构建发布版本时引用调试 dll