替换C#DLL中的#ifdefs

时间:2015-10-07 08:36:59

标签: c# c++ .net dll

我有一个使用#defines的C ++ DLL(这些定义是根据构建配置自动定义的,例如Debug,Release等)

public <T extends Shape> WidgetSelectionModel<T> getSelectionModel(final Class<T> shapeClass, final boolean canBeSelected) {
   return WidgetSelectionModel.class.cast(new EllipseSelectionModelImpl(canBeSelected));
}

我需要在C#dll中使用相同的功能。 如果我在C#dll中定义一些全局常量并使用它们,那没关系 而不是定义? e.g。

#if defined(CONSTANT)
..
// Some code
#else
// Some other code

然后,当我想发送DLL时,我会提前(可能在声明时作为默认值)将if(Globals.SomeConstant == SOMEVALUE) // Do this else // Do smth else 分配给SOMEVALUE - 这会以这种方式工作吗? (取决于我需要的配置)。

我看到了一些类似的问题,但它们不是关于DLL的。

2 个答案:

答案 0 :(得分:0)

您可以像在c ++中一样使用它

您可以在源代码中定义/取消定义它们或作为条件编译符号。在visual studio中,可以使用 Solution Explorer - Properties - Build - 条件编译符号

但是,现在人们倾向于使用配置文件来表示这些常量。这样,您不必重新编译源代码,也不必重新分发它以更改行为。

最简单的方法是通过visual studio 解决方案资源管理器 - 属性 - 设置

您可以为大多数类型添加设置。布尔最接近#define。使用int可以为您提供两种以上的可能性。如果您希望能够使用#define为TimeSpan或URI使用多个值,请查看困难。

使用设置的好处是可以生成一个类来轻松访问设置。

另一种方法是使用System.Configuration.ConfigurationManager类直接读取配置文件。这为您提供了更多关于配置格式的自由。缺点是您必须自己将读取值转换为适当的类型,如果无法读取值,则包含处理错误。

总结:配置文件方法的优点:

  • 无需更改源文件
  • 无需重新编译
  • 无需重新安装
  • 仅更改需要更改的计算机上的配置文件
  • 提高了类型安全性

答案 1 :(得分:0)

我之前的回答引出的问题多于答案。因此,我认为一个例子会有所帮助。

假设我有一个名为MyDll的DLL。它有一个配置设置,在很久以前就会使用#define定义。

我的C-synctax有点生疏,但看起来像是:

#define UseAlternateGreeting
public class MyClass
{
    public string GetGreeting()
    {
        #if defined UseAlternateGreeting
            return "Hello World!";
        #else
            return "Here I am!";
        #endif
    }
}

现在假设我们有几个使用此DLL的程序。程序!想要使用默认设置。但是Program2想要使用备用设置。没有办法解决这个问题。

此外,如果我们想要更改设置的值,我们必须重新编译并将所有内容重新分配给每个人。

如果我们只使用记事本编辑文件来更改字符串会不会更容易?

幸运的是,微软也看到了这一优势。十多年来,我们一直有配置文件的想法。程序集有一个配置文件,其中包含应用程序的名称和扩展名 config 。对于知道配置项含义的人,可以使用任何文本编辑器轻松编辑此文件。

如果我们将#define替换为配置文件中的项目,则可以将问候语更改为备用问候语,而无需重新编译和重新分发整个程序。

幸运的是,Visual Studio在创建配置文件时帮助了我们很多。

<强>制剂

  • 让Visual Studio在新的解决方案中创建一个控制台应用程序:将程序命名为 ConfigExample
  • 将新库添加到此应用程序,将其命名为 MyDll
  • 查看MyDll的属性
  • 添加设置

    • 姓名:MySetting,
    • 类型:字符串,
    • 范围:申请,
    • 价值:Hello World! (不带字符串引号)
  • 在项目MyDll中创建一个类 MyClass

    公共类MyClass {     public string GetText()     {         返回Properties.Settings.Default.MySetting;     } }

  • 转到项目ConfigExample

  • 项目添加对MyDll的引用(通过标签页解决方案)
  • 使用主要代码:

    使用MyDll; static void Main(string [] args) {     var obj = new MyClass();     var txt = obj.GetText();     Console.WriteLine(TXT); }

编译并运行,您将看到显示的正确文本。如果你转到程序的debug / bin目录,你会找到一个文本文件 ConfigExample.config 。在文本编辑器中打开它,你会看到...没有任何东西与你好世界!

这意味着您的程序对特殊设置并不感兴趣,可以使用默认设置MyDll的时间设置。

但是,如果您想使用特殊设置,

  • 在Visual Studio中,转到项目MyDll
  • 打开文件app.config
  • a.o。你会找到以下

(为了防止编辑器干扰格式化,我在每行添加了一个撇号)

'</configSections>
'<applicationSettings>
   '<MyDll.Properties.Settings>
        '<setting name="MySetting" serializeAs="String">
            '<value>Hello World!</value>
        '</setting>
    '</MyDll.Properties.Settings>
'</applicationSettings>
  • 将此部分复制粘贴到 ConfigExample.Config
  • 对于所有已经分布的程序,在可执行文件所在的文件夹中执行此操作(在您的情况下:debug / bin)
  • 对于将来构建的所有ConfigExample程序,在ConfigExample项目的App.Config中的visual studio中执行此操作。

结果如下:

'<?xml version="1.0" encoding="utf-8" ?>
'<configuration>
'    <configSections>
'        <sectionGroup name="applicationSettings"     type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="MyDll.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
'        </sectionGroup>
'    </configSections>
'    <applicationSettings>
'        <MyDll.Properties.Settings>
'            <setting name="MySetting" serializeAs="String">
'                <value>Hello World!</value>
'            </setting>
'        </MyDll.Properties.Settings>
'    </applicationSettings>
'   
'   <startup> 
'        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"     />
'    </startup>

'</configuration>

现在我们要做的就是将Hello World改为替代问候语

'        <MyDll.Properties.Settings>
'            <setting name="MySetting" serializeAs="String">
'                <value>Here I am!</value>
'            </setting>
'        </MyDll.Properties.Settings>

运行程序而不构建它,您将看到使用了新值。

优点:   - 它适用于许多可以从字符串中分配的类型 - Type.IsAssignableFrom(typeof(string))。 Visual Studio已经支持很多类型,包括TimeSpan和DateTime。   - 您不必重新编译源代码来更改值   - 几个可执行文件可以使用自己的配置设置:一个程序可以使用原始问候语,另一个程序可以使用备用问候语   - 如果程序未在配置文件中提供值,则使用默认值。   - 您不必自己阅读配置。   - 它是类型安全的:如果你说它是TimeSpan,那么你必须做一些严肃的打字以使它与例如一个整数混淆。

关于配置还有很多话要说,你甚至可以为每个用户配置一个配置。但这远远超出你关于普通C #define的替代品的问题