如何在运行时更改库声明?

How can I change a library declaration at runtime?

在我的许多 .NET 项目中,我声明了全局使用的库函数。包含这些功能的 DLL 在安装产品时注册,因此声明很简单:

例如

   Declare Sub SomeFunction Lib "SomeLib.dll" (ByVal CommonStr As String, ByVal 
   WhichVar As Integer)

但是,当我 debugging/developing 时,我经常需要像这样显式引用 dll 的路径:

   Declare Sub SomeFunction Lib "C:\Usethisone\SomeLib.dll" (ByVal CommonStr As String, ByVal 
   WhichVar As Integer)

我的问题是,在将代码发送给 QA 时,我偶尔会忘记删除文件路径,因此它会被发回。 那么,我如何编写代码,这样我就不需要在每次发送项目进行测试时都记住更改此路径?当然,声明位于 class 的声明部分,因此我不能使用任何 If 逻辑来切换声明(例如,如果 testingfile.txt 存在,则使用测试声明)。

我还考虑过创建一个我可以从中继承的全局 dll - 一个带有生产声明,一个带有测试声明 - 但这是一个低级别的重大变化。恐怕它要么行不通,要么会导致参考问题 and/or 不会得到管理层的批准。

还有更简单的想法吗?

在 VB.NET 中,就像在 C# 中一样,您可以使用 preprocessor directive #if...#else...#end if 声明两个不同版本的 dll,一个用于 DEBUG 编译,一个用于 RELEASE 编译

#if DEBUG Then
   Declare Sub SomeFunction Lib "C:\Usethisone\SomeLib.dll" (ByVal CommonStr As String, ByVal 
   WhichVar As Integer)
#else
   Declare Sub SomeFunction Lib "SomeLib.dll" (ByVal CommonStr As String, ByVal 
   WhichVar As Integer)
#end if

现在,当您编译以将您的应用程序发送给 QA 时,您只需切换到 Release 即可发送正确的实现

旁注:Take a look Declare 和 DllImport 属性之间的区别

您可以使用 Conditional Compilation in Visual Basic

#If DEBUG
    Declare Sub SomeFunction Lib "C:\Usethisone\SomeLib.dll" (ByVal CommonStr As String, _
        ByVal WhichVar As Integer)
#Else
    Declare Sub SomeFunction Lib "SomeLib.dll" (ByVal CommonStr As String, _
        ByVal WhichVar As Integer)
#End If

如果您使用 Debug 配置,您将获得开发代码,如果您使用 Release 配置,您将获得生产版本代码。

请注意 #If 是在编译时计算的,而不是在运行时计算的。只编译匹配的代码。另一个被丢弃了。

另请参阅:#If...Then...#Else Directives