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

时间:2017-12-20 18:56:10

标签: vb.net shared-libraries

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

例如

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

然而,当我正在调试/开发时,我经常需要明确引用dll的路径,如下所示:

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

我的问题是我在将代码发送到QA时偶尔忘记删除文件路径,以便将其发回。 那么,我该如何对此进行编码,以便每次将项目发送出去进行测试时都不需要记得改变这条路径?当然,Declares在类的声明部分中,因此我不能使用任何If逻辑来切换声明(例如,如果testsfile.txt存在则使用测试声明)。

我还想过创建一个我可以继承的全局dll - 一个带有生产声明,一个带有测试声明 - 但这是一个低级别的重大变化。我担心它不会起作用,会引起参考问题和/或不会得到管理层的批准。

那里有任何更简单的想法吗?

2 个答案:

答案 0 :(得分:2)

在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属性之间的差异

答案 1 :(得分:2)

您可以使用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