我有一个使用Microsoft DLL(Microsoft.ComponentStudio.ComponentPlatformImplementation.dll)的应用程序,该DLL用于操作系统部署和访问目录文件。版本6.0.0.0特定于Windows Server 2008目录文件。较新的版本6.1.0.0特定于Windows Server 2008 R2目录文件。尝试使用不正确的版本访问目录文件会导致异常。
我的应用程序(使用VS2005的VB.NET)需要能够访问这些目录的任何一个版本 - 我对两个可执行文件(每个目录版本一个)感到满意,但显然我不想维护两个每个的源代码。
由于DLL名称相同,因此无法在项目引用中指定两组DLL。我不想每次想要构建时都手动添加和删除DLL引用。据我所知,接口等在两者之间实际上是相同的。
我在这里和其他地方读过一些关于bindingRedirect,Assembly.Load等的文章,但似乎都没有结果。
答案 0 :(得分:0)
Assembly.Load应该可以正常工作。确保使用期望AssemblyName或字符串变体的变体,但将完整的程序集名称作为字符串(例如“Microsoft.ComponentStudio.ComponentPlatformImplementation,Version = 6.1.0.0,Culture = findout,PublicKeyToken = findout”)。确认这实际上允许您同时加载两个DLL。
然后使用.GetExportedTypes()来调用您所追求的特定API。
答案 1 :(得分:0)
好吧,我自己找到了解决方案 - 我会在这里发布,以防它对某人有用。
解决方案要求我为每个版本的CPI DLL编写一个包装类。每个包装类都存在于它自己的项目中,因此我可以将每个CPI DLL的引用添加到项目以及DLL的副本。这样我就保留了早期绑定,Intellisense等。
CPI程序集中的类等对其他项目完全隐藏,因此我必须添加方法来访问CPI所需的任何数据等。 CPI DLL的副本也放在主项目的bin \ Debug和bin \ Release文件夹下的文件夹中。我使用app.config来使编译器找到它们,这可以防止DLL被复制到Debug \ Release并相互覆盖。 这是app.config的相关部分:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.ComponentStudio.ComponentPlatformInterface"
publicKeyToken="31bf3856ad364e35"
culture="neutral" />
<codeBase version="6.0.0.0"
href="../CPIv6000Bin/Microsoft.ComponentStudio.ComponentPlatformImplementation.dll"/>
<codeBase version="6.1.0.0"
href="../CPIv6100Bin/Microsoft.ComponentStudio.ComponentPlatformImplementation.dll"/>
</dependentAssembly>
</assemblyBinding>
拥有CPI DLL的多个副本可能是不可取的,不必要的和不优雅的,我会进一步研究这一点 - 这只是我此时的PoC解决方案。
虽然CPI中有多个DLL,但测试表明我只需要在app.config中引用这个主DLL。
问候,ShadeSeeker。