2017-02-08 6 views
0

Мне нужно получить имена с смарт-карты на моем компьютере из службы.Запустить программу как .exe dll miss match? (Метод не найден)

У меня есть эта программа для записи имен всех смарт-карт в файл.

using System; 
using System.Threading.Tasks; 
using Windows.Devices.Enumeration; 
using Windows.Devices.SmartCards; 

namespace DeviceEnumerationConsoleTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      EnumerateDevices().Wait(); 
     } 

     static async Task EnumerateDevices() 
     {   
      try 
      { 
       string selector = SmartCardReader.GetDeviceSelector();    
       DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector); 
       string ret = "start1 "; 
       foreach (DeviceInformation device in devices) 
       { 
        ret = ret + device.Name + " _ "; 
       } 

       System.IO.File.WriteAllText(@"C:\ProgramData\IDNORTH\cards.txt", ret); 

      }catch(Exception e) 
      { 
       System.IO.File.WriteAllText(@"C:\ProgramData\IDNORTH\error.txt", e.Message); 
      } 
     } 
    } 
} 

Эта работа отличная, когда я запускаю ее самостоятельно.

Однако, когда я запускаю его из-за пределов иногда работать и иногда возвращается

метод не найден: Void System.Threading.Tasks.Task.AddToActiveTasks(System.Threading.Tasks.Task).

от линии:

DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector); 

Я считаю, что от ошибки есть некоторая проблема с DLLs. В проекте я добавил ссылки.

C: \ Program Files (x86) \ Windows \ Наборы 8.1 \ Ссылки \ CommonConfiguration \ Нейтральная \ Windows.winm d

и

C: \ Program Files (x86) \ Microsoft SDKs \ WindowsPhoneApp \ v8.1 \ Tools \ MDILXAPCompile \ Framework \ Sys tem.Runtime.WindowsR untime.dll

Я вызываю exe из службы и не добавил или не изменил никаких ссылок. Он имеет ту же самую ссылку на Windows, что и в Project1.

+0

Я не уверен, что это поможет вам. Поскольку вы сказали, что это не работает, но иногда. Это явно указывает на какую-то проблему «времени». 1. Когда вы не указываете тип потока, по умолчанию это поток «Foreground», поэтому даже если вы не «ждете» на нем, созданный поток все еще ждет завершения «переднего потока». 2. Теперь существует ограничение по времени для службы Windows OnStart, она должна завершить свою работу в течение 15 секунд и должна вернуть управление ОС, иначе это будет считаться сбоем, и окна прервут процесс. – Thangadurai

+0

Я предполагаю, что ваш DoWork занимает больше времени, и из-за ограничения для события OnStart процесс завершается. – Thangadurai

+0

Вы выполняете синхронизацию работы, выполняемой в файле project1.exe? Будет ли это той же проблемой, если вы дождитесь завершения процесса Process.Start перед запуском нового? – Default

ответ

0

Не уверен, что это процедура, но я думал, что должен отметить это как ответ, так как он работает сейчас. Изменена ссылка на C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETCore \ v4.5 \ System.Runtime. WindowsRuntime.dll

Спасибо!

Смежные вопросы