我想建立一个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被识别。但是抛出发生在我开始调试的时候。
2条答案
按热度按时间zed5wv101#
尝试使用DllImport直接导入。
xpszyzbs2#
使此工作的一个选项是在项目中正常包含引用,但选择不将其复制到生成时的输出。
然后,在程序中的某个地方,为当前域(
AppDomain.CurrentDomain
)提供AppDomain.AssemblyResolve
的处理程序。在处理程序中,您可以尝试从固定文件夹加载,例如:Assembly.LoadFrom
。AssemblyResolve
事件处理程序将程序集名称作为字符串,但您可能希望将其转换为AssemblyName
以解析名称、版本和(如果适用)公钥标记。