我有一个使用#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的。
答案 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在创建配置文件时帮助了我们很多。
<强>制剂强>
添加设置。
在项目MyDll中创建一个类 MyClass
公共类MyClass { public string GetText() { 返回Properties.Settings.Default.MySetting; } }
转到项目ConfigExample
使用主要代码:
使用MyDll; static void Main(string [] args) { var obj = new MyClass(); var txt = obj.GetText(); Console.WriteLine(TXT); }
编译并运行,您将看到显示的正确文本。如果你转到程序的debug / bin目录,你会找到一个文本文件 ConfigExample.config 。在文本编辑器中打开它,你会看到...没有任何东西与你好世界!
这意味着您的程序对特殊设置并不感兴趣,可以使用默认设置MyDll的时间设置。
但是,如果您想使用特殊设置,
(为了防止编辑器干扰格式化,我在每行添加了一个撇号)
'</configSections>
'<applicationSettings>
'<MyDll.Properties.Settings>
'<setting name="MySetting" serializeAs="String">
'<value>Hello World!</value>
'</setting>
'</MyDll.Properties.Settings>
'</applicationSettings>
结果如下:
'<?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的替代品的问题