Я пишу класс, который хочу использовать как в Windows, так и в Linux.
Один из методов этого класса — доступ к Реестр Windows
Чего я надеюсь добиться, так это каким-то образом запретить использование этого конкретного метода при использовании машины с Linux.
< br>Прежде всего я провел небольшое исследование, чтобы узнать, есть ли что-то для .Net Core это позволило бы мне проверить, какая операционная система используется, я нашел это и, конечно же, это работает.
Когда я реализовал это в своем коде при доступе к методу, я надеялся отключить метод, который обращается к реестру Windows, однако ближе всего к этому я смог добраться с помощью оператора switch. , что-то вроде этого
switch (OS)
{
case OSX:
return;
case LINUX:
return
}
К return
, если операционная система не поддерживалась, это работало, однако я тогда подумал, что будет гораздо лучше отключить доступ к ней все вместе, чем выдавать ошибку для операционной системы, которая не поддерживается для этого конкретного метода
Затем я перешел к директивам препроцессора думая, что если я смогу обнаруживать и отключать части кода в зависимости от фреймворков и т. д., возможно, я мог бы использовать что-то подобное, чтобы отключить части кода в зависимости от операционной системы, чтобы они никогда не могли быть вызваны даже при попытке доступа метод
Я продолжил оттуда, чтобы посмотреть, смогу ли я отключить части кода с помощью preprocessor directives
.
Я нашел это.
Я понимаю, что это для C++ однако он кажется наиболее близким к тому, чего я пытаюсь достичь в рамках .Net Core
В идеальном мире это выглядело бы примерно так
/// <summary>
/// Get the file mime type
/// </summary>
/// <param name="filePathLocation">file path location</param>
/// <returns></returns>
`#if WINDOWS`
public static string GetMimeType(this string filePathLocation)
{
if (filePathLocation.IsValidFilePath())
{
string mimeType = "application/unknown";
string ext = Path.GetExtension(filePathLocation).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
{
mimeType = regKey.GetValue("Content Type").ToString();
}
return mimeType;
}
return null;
}
`#endif`
Я видел #Define
, поэтому я попробовал что-то вроде этого #define IS_WINDOWS
и добавил его в свой класс вместе с #if IS_WINDOWS
, однако я не мог понять, как изменить это значение, если я надеюсь просто повторно использовать статический класс снова и снова.
#if WINDOWS
было бы правдой, хотя на самом деле это не так... - person Jérôme MEVEL   schedule 21.09.2018