Visual Studio 在Visual Basic Class Projekt中链接.DLL不起作用,FileNotFoundException

dced5bon  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(134)

我想建立一个DLL导入另一个DLL在一个固定的目录。我想导入的DLL与一些我不能修改的相对路径一起工作,我对这个“外部”DLL没有任何了解。我刚刚得到的信息,它是编译为32位。
对于我的DLL,这是一个Visual Basic类库(与Visual Studio 2022目标框架.NET目标框架4.62一起工作),重要的是不要将外部DLL的任何部分复制到我的项目文件夹中,因为它只是为它现在所在的“固定”目录工作。
谢谢你的帮助
到目前为止,我尝试了以下步骤:

  • 我通过添加现有元素->添加为链接->属性设置为“内容”+“不显示”添加外部.DLL
  • 然后我意识到,“添加为链接”是不够的,现在定义“导入ExampleDLL”
  • 所以也试图在推荐管理器中找到DLL来将其添加为引用。
  • 它最初并不存在,所以我去了项目属性,并添加了引用路径,外部DLL奠定了现在。
  • 然后我可以选择.DLL在推荐管理器下的大会,并选择它。
  • 我在引用的属性中取消选择了本地副本。
  • 现在找到了导入的空间,我可以构建该项目。

我仍然得到FileNotFoundException:
FileNotFoundException:数据或程序集“ExampleDLL,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或Abhängigkeit davon wurde nicht gefunden.这个系统无法找到合适的数据。
我还尝试通过以下方式在app.config中添加DLL的路径:

<runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="test"                                                
                          culture="neutral"
                          publicKeyToken="e33b67d3bb5581e4"/>
        <codeBase version="1.0.0.0" 
                  href="FILE:///C:/Applications/xxx/bi/ExampleDLL.dll"/>
    </dependentAssembly>
</assemblyBinding>
</runtime>

但我现在也没有得到这个工作。
有没有人能告诉我正确的方法来导入一个DLL,而不改变它的原始目录,也不复制任何DLL。我不能看DLL,所以我真的不能告诉什么是失踪的权利。
在这里,我添加了来自装配融合日志的日志(对不起,德语)

*** Protokolleintrag für Assembly-Binder  (12.09.2023 @ 11:20:29) ***

Fehler bei diesem Vorgang.
Ergebnis der Bindung: hr = 0x80070002. Das System kann die angegebene Datei nicht finden.

Der Assemblymanager wurde geladen aus:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Als EXE-Datei ausgeführt.  C:\xxx\xxx\xxx\xxx\bin\x86\Debug\xxx.exe
--- Ein detailliertes Fehlerprotokoll folgt. 

=== Zustandsinformationen vor Bindung ===
LOG: DisplayName = ExampleDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/xxx/xxx/xxx/xxx/bin/x86/Debug/
LOG: Ursprünglicher PrivatePath = NULL
LOG: DynamicBase = NULL
LOG: CacheBase = NULL
LOG: AppName = xxx.exe
Aufruf von Assembly : xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: Diese Bindung startet im default-Load-Kontext.
LOG: Die Anwendungskonfigurationsdatei wird verwendet: C:\xxx\xxx\xxx\xxx\bin\x86\Debug\xxx.exe.Config
LOG: Die Hostkonfigurationsdatei wird verwendet: 
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config wird verwendet.
LOG: Die Richtlinie wird derzeit nicht auf den Verweis angewendet (private, benutzerdefinierte, teilweise oder pfadbasierte Assemblybindung)
LOG: Download von neuem URL file:///C:/xxx/xxx/xxx/xxx/bin/x86/Debug/ExampleDLL.DLL.
LOG: Download von neuem URL file:///C:/xxx/xxx/xxx/xxx/bin/x86/Debug/ExampleDLL/ExampleDLL.DLL.
LOG: Download von neuem URL file:///C:/xxx/xxx/xxx/xxx/bin/x86/Debug/ExampleDLL.EXE.
LOG: Download von neuem URL file:///C:/xxx/xxx/xxx/xxx/bin/x86/Debug/ExampleDLL/ExampleDLL.EXE.
LOG: Fehler bei allen Such-URLs.

因此,它基本上是在寻找项目斌/垃圾桶仍然,当然它没有找到任何东西。正确的搜索URL应该是:

URL file:///C:/Applications/xxx/bi/ExampleDLL.dll

在我的应用程序中,异常出现在这一行:

Public Module Testmodule
    Public WithEvents DLLTest As New ExampleDLL.M1

因此,在DLL中定义的Sub M1被识别。但是抛出发生在我开始调试的时候。

zed5wv10

zed5wv101#

尝试使用DllImport直接导入。

<DllImport("C:\Applications\xxx\bi\ExampleDLL.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function SomeFunction() As Integer

End Function
xpszyzbs

xpszyzbs2#

使此工作的一个选项是在项目中正常包含引用,但选择不将其复制到生成时的输出。
然后,在程序中的某个地方,为当前域(AppDomain.CurrentDomain)提供AppDomain.AssemblyResolve的处理程序。在处理程序中,您可以尝试从固定文件夹加载,例如:Assembly.LoadFrom
AssemblyResolve事件处理程序将程序集名称作为字符串,但您可能希望将其转换为AssemblyName以解析名称、版本和(如果适用)公钥标记。

相关问题