Ошибка и съедание памяти

195
07 мая 2018, 21:56

Есть программа, которая записывает действия мыши (макрос) и там есть возможность вставлять С#. У меня между командами вставляется 3 C# кода, то есть примерно это выглядит так:

C# 
КЛИК ПО КООРДИНАТАМ (CLICK X X)
ВСТАВИТЬ В ПОЛЕ ИЗ БУФЕРА ОБМЕНА (PASTE)
ЖДЁМ 3 СЕК (DELAY 3000)
C# 
КЛИК ПО КООРДИНАТАМ (CLICK X X)
ВСТАВИТЬ В ПОЛЕ ИЗ БУФЕРА ОБМЕНА (PASTE)
ЖДЁМ 3 СЕК (DELAY 3000)
C#
КЛИК ПО КООРДИНАТАМ (CLICK X X)
ВСТАВИТЬ В ПОЛЕ ИЗ БУФЕРА ОБМЕНА (PASTE)

Иногда всё работает стабильно без ошибок, иногда выдаёт ошибку:

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны. Проверьте, что ваша функция Main помечена атрибутом STAThreadAttribute.

А иногда Windows пишет, что недостаточно памяти. Скорее всего я что-то недопонимаю и что-то работает нелогично. Я около недели пытался найти решение проблемы, но ничего не помогло. Последнее, что я сделал, это добавил [STAThread], но и это тоже не помогло. Поэтому пришёл спрашивать советы у Вас. Сильно не ругайте меня, с C# у меня первый опыт.

Прикрепляю 3 вставки кода:

using System;
using System.IO;
using System.Net;
using System.Text;
public class Program {
 [STAThread]
 public static void Main() {
  try {
   using(var file_track_title = new StreamReader(@"C:\Users\Administrator\Desktop\AMData\track_title.txt")) {
    System.Windows.Forms.Clipboard.SetText(file_track_title.ReadLine());
   }
  } catch (Exception ex) {
   System.Windows.Forms.MessageBox.Show(ex.Message);
  }
 }
}
using System;
using System.IO;
using System.Net;
using System.Text;
public class Program {
 [STAThread]
 public static void Main() {
  try {
   using(var file_login = new StreamReader(@"C:\Users\Administrator\Desktop\AMData\login.txt")) {
    System.Windows.Forms.Clipboard.SetText(file_login.ReadLine());
   }
  } catch (Exception ex) {
   System.Windows.Forms.MessageBox.Show(ex.Message);
  }
 }
}
using System;
using System.IO;
using System.Net;
using System.Text;
public class Program {
 [STAThread]
 public static void Main() {
  try {
   using(var file_password = new StreamReader(@"C:\Users\Administrator\Desktop\AMData\password.txt")) {
    System.Windows.Forms.Clipboard.SetText(file_password.ReadLine());
   }
  } catch (Exception ex) {
   System.Windows.Forms.MessageBox.Show(ex.Message);
  }
 }
}
Answer 1

Можно так

static void Main(string[] args)
{
    string file = @"D:\test.txt";
    System.Threading.Thread thread = new Thread(() => SetToClipboard(file));
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}
private static void SetToClipboard(string pathToFile)
{
    try
    {
        string line = String.Empty;
        //все же поток лучше закрыть перед тем как дергать др.сущность типа Clipboard
        using (var sr = new StreamReader(pathToFile))
        {
            line = sr.ReadLine();
        }
        if (!String.IsNullOrEmpty(line))
        {
            System.Windows.Forms.Clipboard.SetText(line);
        }
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
}
READ ALSO
Разработка обновляемых приложении на WPF

Разработка обновляемых приложении на WPF

Изучаю C# и WPFПодскажите пожалуйста какие темы необходимо прочитать для реализации удаленного обновления приложения у конечного пользователя

194
Внедрить dll в exe

Внедрить dll в exe

Подскажите пожалуйста, как исправить код ниже (c# winforms vs2010)Сейчас выдает ошибку "Не удалось загрузить файл Newtonsoft

200
PredicateBuilder

PredicateBuilder

Нашёл пример как можно по частям собирать linq запросС помощью класса predicateBuilder

209
Ошибка при запуске консоли под .NET Framework на Debian

Ошибка при запуске консоли под .NET Framework на Debian

Появляется ошибка при запуске ConsoleApp2exe на Debian x86

189