Невозможно привести объект типа 'System.__ComObject' к типу 'Windows.ApplicationModel.Background.ILocationTriggerFactory

Я создаю простое приложение Win Phone 8.1, которое использует Geofence API и фоновые задачи для контроля, когда пользователь входит / покидает какую-то область.
Чтобы зарегистрировать фоновое задание, которое я реализую RegisterBackgroundTask метод в App учебный класс

    /// <summary>
    /// Initializes the singleton application object.  This is the first line of authored code
    /// executed, and as such is the logical equivalent of main() or WinMain().
    /// </summary>
    public App()
    {
        this.Suspending += this.OnSuspending;
        this.RegisterBackgroundTask();
    }

    private async void RegisterBackgroundTask()
    {
        const string name = "GeofenceBackgroundTask";

        if (BackgroundTaskRegistration.AllTasks.Any(task => task.Value.Name == name))
        {
            return;
        }

        var loc = await new Geolocator().GetGeopositionAsync(
            TimeSpan.FromMinutes(2),
            TimeSpan.FromSeconds(5));   //needed to trig user acceptance

        var backgroundAccessStatus =
            await BackgroundExecutionManager.RequestAccessAsync();

        if (backgroundAccessStatus != BackgroundAccessStatus.Denied)
        {
            var geofenceTaskBuilder = new BackgroundTaskBuilder()
            {
                Name = name,
                TaskEntryPoint = "RingtoneManager.Background.GeofenceBackgroundTask"
            };

            geofenceTaskBuilder.SetTrigger(new LocationTrigger(LocationTriggerType.Geofence));
            geofenceTaskBuilder.Register();
        }
    }

И это та часть, в которой возникают исключения new LocationTrigger(LocationTriggerType.Geofence)

Детали исключения:

System.InvalidCastException was unhandled by user code
HResult=-2147467262
Message=Unable to cast object of type 'System.__ComObject' to type   'Windows.ApplicationModel.Background.ILocationTriggerFactory'.
Source=mscorlib
StackTrace:
   at System.StubHelpers.StubHelpers.GetCOMIPFromRCW_WinRT(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget)
   at Windows.ApplicationModel.Background.LocationTrigger..ctor(LocationTriggerType triggerType)
   at RingtoneManager3.App.<RegisterBackgroundTask>d__2.MoveNext()

Что я понял до сих пор:

  1. Код исключения: 80004002 (E_NOINTERFACE)
  2. Я выяснил, что это за интерфейс, и обнаружил, что он объявлен в C:\Program Files (x86)\Windows Phone Kits\8.1\References\CommonConfiguration\Neutral\Windows.winmd и его на самом деле тамокно ildasm

    И его ссылка из визуального проекта студииссылки на решениеэталонные свойства

  3. Все остальные триггеры (SystemTrigger, MaintenanceTrigger и т. Д.) Прекрасно работают

Что я уже пробовал:

  1. Переустановите VS
  2. Очистить / восстановить решение
  3. Метод аннотирования RegisterBackgroundTask с [STAThread]

Это мое первое приложение на Windows Phone и на C#, поэтому я могу сделать несколько глупых ошибок в обычном месте. Я также не понимаю, как Visual Studio обрабатывает эти ссылки из решения и как интерфейсы, закодированные в ссылочных файлах.winmd, стали доступны для кода в проекте. Может быть, там что-то идет не так. Поэтому мне нужна помощь в поиске причины проблемы и поиске решения.

заранее спасибо

1 ответ

Может быть, "LocationTrigger" является синглтоном? (извините, не знаю телефон) и был (уже) активирован в другом месте с помощью стандартной системы.__ComObject RCW. Если это так, его нельзя разыграть. Попробуйте вместо этого использовать Activator.CreateInstance.

Type t = Type.GetTypeFromProgID("WhateverTheProgIdIsHere");
System.Object obj = Activator.CreateInstance(t);
ILocationTriggerFactory tf = obj as ILocationTriggerFactory;
Другие вопросы по тегам