C#“必須先將當前線程設置為單個線程單元(STA)模式方可進行OLE調用”異常解決方案

来源:https://www.cnblogs.com/YangJianhui/archive/2018/07/19/9335321.html
-Advertisement-
Play Games

關於這類問題網上搜索會有很多解決方案,但基本的意思都相差不大,大致問題出於啟用線程時調用類似剪貼板Clipboard.SetDataObject出錯,我把我的測試代碼展現下: 解決方案:只需將thread.SetApartmentState(ApartmentState.STA);反註釋就可以了。 ...


  關於這類問題網上搜索會有很多解決方案,但基本的意思都相差不大,大致問題出於啟用線程時調用類似剪貼板Clipboard.SetDataObject出錯,我把我的測試代碼展現下:

  解決方案:只需將thread.SetApartmentState(ApartmentState.STA);反註釋就可以了。

  出現的原因:

  單元是進程內部具有相同線程訪問要求的對象的邏輯容器。同一單元中的所有對象都可以接收從該單元中的任何線程發出的調用。
.NET Framework 不使用單元,托管對象自己負責以線程安全的方式使用所有共用資源。由於 COM 類使用單元,因此公共語言運行
庫需要在 COM interop 的情況下調用 COM 對象時創建並初始化一個單元。托管線程可以創建併進入只允許有一個線程的單線程單
元 (STA) 或者包含一個或多個線程的多線程單元 (MTA)。通過將線程的 ApartmentState 屬性設置為 ApartmentState 枚舉值之一
,可以控制所創建的單元的類型。由於給定線程只能初始化 COM 單元一次,因此在第一次調用非托管代碼之後就不能更改單元類型。

註:在網路上找了兩篇文章或許更能說明這個問題。文章的大意是,由於很多COM在.NET環境下如果使用多線程的話,會導致引用的COM不能正常運行,
而如果不聲明程式為STAThread的話,.NET就會自動使用多線程來提高效率,這樣就會導致不可預知的後果。

  A young ilder ~ an old beggar !


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文本框顯示 文本框正常顯示: 文本框超出區域顯示: 實現方案 判斷文本框是否超出區域 請見《TextBlock IsTextTrimmed 判斷文本是否超出》 設置文本佈局顯示 1. FlowDirection 當文本超出顯示區域時,設置FlowDirection靠右顯示 下麵是封裝的附加屬性Scr ...
  • 工作中有這樣一個需求,有N張不同的報表,每張報表對應一個數據源,統計數據採用記憶體方式,首先在內在里定義了數據源對應實體。統計條件用lamdba表達式式實現,通過工具對單元格進行定義。在實現過程中針對每一張表來寫取數顯示是很Low的了,取數條件定義都是規則的,統計實現就是一段C#代碼,但是要針對不同的 ...
  • 起因:一臺伺服器中部署的程式,停電後未按照計劃任務正常啟動。 一、創建並配置Windows服務程式 開發工具VS2015 Framework版本2.0 1.新建Windows服務 2.在Service.cs中編寫服務程式所需要執行的操作 服務運行時會自動載入Service1中的代碼,亦有OnStar ...
  • 直接上乾貨簡單易懂 //磁碟監控(遠程/本地) //需要引用System.Management.dll public class RemoteMonitoring { private static string strMsg = ""; private static long freesize = ...
  • 在前文[基於.net core 微服務的另類實現]結尾處,提到瞭如何方便自動的生成微服務的客戶端代理,使對於調用方透明,同時將枯燥的東西使用框架集成,以提高使用便捷性。在嘗試了基於 Emit 中間語言後,最終決定使用生成代碼片段然後動態編譯的模式實現。背景:其一在前文中,我們通過框架實現了微服務面向... ...
  • 程式集版本 一個程式集會有三個版本,每個版本都是做什麼的呢,我們來看一下,每個版本號的用途及正確用法: 版本號 示例版本號: Major(主版本號)|Minor(次版本號)|Build(內部版本號)|Revision(修訂號) | | | 2 | 3 | 719 | 5 前兩個編號構成了公眾對版本的 ...
  • //使用時需要將配置里的內容換成自己的; ...
  • 概要 書簽的設置可以幫助我們快速的定位某段文字,使用起來很方便,也很節省時間。在前一篇文章“C# 如何添加/刪除Word書簽”中介紹了插入、刪除書簽的方法,本篇文章將對C# 操作Word書簽的功能做進一步介紹。示例內容將包含以下要點: 在現有書簽位置插入圖片 在現有書簽位置插入表格 讀取書簽位置的文 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...