Gelöst: Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden
Problem:
Beim Verwenden der Windows Zwischenablage Clipboard in einer Addin Anwendung für Word kommt die Meldung, dass das Clipboard nicht als STA Thread deklariert ist.
Source-Code mit Fehler:
Aktuell wird im Programm eine verkleinerte Bitmap aus einem Foto erzeugt, welche dann in die Zwischenablage gelegt werden soll.
Image outImage = new Bitmap(source_Bitmap, new_Width, new_Height); Clipboard.SetImage(outImage); //*Error with STA |
Lösung:
Man muss einen neuen Thread für den Vorgang öffnen und mit Start und Join ausführen.
Hier im Code-Besipiel wird ein neuer Thread erzeugt und ausgeführt.
new Thread((ThreadStart)(() => { Problem-Code })); |
Komplettes Code-Beispiel
Bitte beachten: der Thread muss als SetApartmentStart mit STA eingestellt werden und dann mit .Start gestartet werden.
Image outImage = new Bitmap(source_Bitmap, new_Width, new_Height); var t = new Thread((ThreadStart)(() => { Clipboard.SetImage(outImage); })); t.SetApartmentState(ApartmentState.STA); t.Start(); t.Join();
|
Betrifft:
C# in Windows Forms, WPF, Aufruft Clipboard in VSTO Word Intercom Addin
Fehlermeldung:
Message=Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können.
Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist.
System.Threading.ThreadStateException HResult=0x80131520 Message=Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist. Source=word_Addin_03_Photos StackTrace: at Addin_Word_Photos_into_Table.Ribbon1.load_Photo_compressed_to_Clipboard(String input_Image_Path, Int32 setLength) in .. |
Lösung:
Beispiel Code
Mit
public static void load_Photo_compressed_to_Clipboard(string input_Image_Path, int setLength) { //---------------< Image_resize() >--------------- Bitmap source_Bitmap = new Bitmap(input_Image_Path);
double dblWidth_origial = source_Bitmap.Width; double dblHeigth_origial = source_Bitmap.Height;
//< check orientation > bool IsOrientation_Horizontal = (dblWidth_origial > dblHeigth_origial) ? true : false; //</ check orientation >
int new_Height = 0; int new_Width = 0; double zoom_factor = 1; if (IsOrientation_Horizontal == true) { new_Width = setLength; zoom_factor = new_Width / dblWidth_origial; new_Height = (int)(dblHeigth_origial * zoom_factor); } else { new_Height = setLength; zoom_factor = new_Height / dblHeigth_origial; new_Width = (int)(dblWidth_origial * zoom_factor); }
Image outImage = new Bitmap(source_Bitmap, new_Width, new_Height); var t = new Thread((ThreadStart)(() => { Clipboard.SetImage(outImage); })); t.SetApartmentState(ApartmentState.STA); t.Start(); t.Join();
//---------------</ Image_resize() >--------------- }
|