Как узнать, поддерживается ли этот метод в Windows Mobile?

Есть некоторые классы (.NET framework 3.5), которые содержат некоторые методы, которые поддерживаются в .NET Compact Framework, и некоторые методы, которые не поддерживаются. Есть также некоторые классы, которых нет в .NET Compact Framework.

Например, для _1 _, функция File.Create поддерживается .NET Compact Framework, а функция File.Encrypt - нет.

Другой пример: класс System.IO.File поддерживается .NET Compact Framework, а класс System.Diagnostic.StackTrace - нет.

Мне нужно сказать компилятору что-то вроде этого:

#ifdef COMPACT_FRAMEWORK   // I'm compiling this from a smart device project

MyEncryptMethod("filename");

#else // I'm compiling this from a desktop project

File.Encrypt("filename");

#endif

Как я могу это сделать?
(Конкретная версия - Windows Mobile 6.1 Professional).


person Nick    schedule 06.11.2012    source источник
comment
Ну что не так с предоставленным вами кодом?   -  person Kevin Gosse    schedule 06.11.2012
comment
Что ж, внимательно прочтите MSDN. Я считаю, что вы можете использовать отражение для проверки, но если ваша программа должна работать, вам всегда нужно проверять документацию при ее программировании и предоставлять альтернативные методы.   -  person Alvin Wong    schedule 06.11.2012
comment
@KooKiz COMPACT_FRAMEWORK - это слово, которое я придумал.   -  person Nick    schedule 06.11.2012
comment
social.msdn.microsoft .com / Forums / en-US / netfxcompact / thread /.   -  person Alvin Wong    schedule 06.11.2012
comment
Вы можете просто определить конфигурацию сборки, которую вы будете использовать при сборке для компактной платформы. В этой конфигурации сборки определите символ условной компиляции COMPACT_FRAMEWORK.   -  person Kevin Gosse    schedule 06.11.2012
comment
@KooKiz да, ты прав. Я не думал.   -  person Nick    schedule 06.11.2012
comment
Вы также можете запустить проект SmartDevice и запустить его в окнах рабочего стола, за исключением того, что вы используете некоторые API / сборки только для CompactFramework. - Другой подход - обработка исключений MissingMethod в строках кода, которые используют строки кода Full Framework.   -  person josef    schedule 07.11.2012


Ответы (3)


Просто чтобы добавить, поскольку вы показываете windows-mobile и windows-mobile-6, вам следует изменить ограничение #define на PocketPC вместо COMPACT_FRAMEWORK.

#ifdef PocketPC   // PocketPC is what the WM SDK uses

MyEncryptMethod("filename");

#else // I'm compiling this from a desktop project

File.Encrypt("filename");

#endif

Обновление:

Ник: Что сказал yms. :) При создании проекта с использованием одного из проектов Smart Device Visual Studio автоматически добавляет в проект символ условной компиляции PocketPC.

В главном меню VS2008 нажмите «Проект» и выберите «Свойства» внизу.

На странице свойств вашего проекта перейдите на вкладку «Сборка», и там вы увидите, где PocketPC уже определен для вас.

person jp2code    schedule 07.11.2012
comment
Не могли бы вы уточнить? Почему Pocket PC вместо Compact Framework? Какая разница? - person Nick; 07.11.2012
comment
@Nick Visual Studio по умолчанию добавляет в проекты WinMo символ PocketPC - person yms; 07.11.2012

Код, который вы предоставили, хорош, вам просто нужно определить символ компиляции COMPACT_FRAMEWORK.

Сначала определите конфигурацию сборки, которую вы будете использовать при сборке сборки для компактной платформы. Затем в этой конфигурации сборки просто определите символ условной компиляции COMPACT_FRAMEWORK.

Символы условной компиляции определяются на вкладке Build свойств проекта.

person Kevin Gosse    schedule 06.11.2012

Вот код, который ищет метод внутри класса:

    public static bool execCmd(string sFunc, string sArg, ref string sResponse)
    {
        bool bRet = true;
        try
        {
            // Instantiate this class
            myCommands cmbn = new myCommands(sFunc, sArg);

            // Get the desired method by name: DisplayName
            //MethodInfo methodInfo = typeof(CallMethodByName).GetMethod("DisplayName");
            MethodInfo methodInfo = typeof(myCommands).GetMethod(sFunc);

            // Use the instance to call the method without arguments
            methodInfo.Invoke(cmbn, null);
            sResponse = cmbn.response;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Exception in execCmd for '" + sFunc + "' and '" + sArg + "' " + ex.Message); 
            bRet = false; 
        }
        return bRet;
    }

Вы должны изменить myCommands на класс, который вы ищете, а sFunc должен быть установлен на метод, который вы ищете. С помощью этого кода вы можете проверить, существует ли метод в классе.

~ Йозеф

person josef    schedule 09.11.2012