【问题标题】:C++/cli -> calling c# dll -> calling OpenFileDialog issueC++/cli -> 调用 c# dll -> 调用 OpenFileDialog 问题
【发布时间】:2010-07-06 00:55:29
【问题描述】:

我为 C++ 程序编写扩展。我编写标准 C/C++ dll 并使用 IJW 调用 C# dll。在我编写并调用了一个 C# dll 之前,这一直很有效,该 dll 又调用了一个 OpenFileDialog 和一个 SaveFileDialog。每当使用 ShowDialog 调用其中任何一个时,应用程序都会冻结。

因此,在制作“最小工作示例”时,我得到了: System.Windows.Forms.dll 中出现“System.Threading.ThreadStateException”类型的未处理异常

附加信息:在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。仅当将调试器附加到进程时才会引发此异常。

所以,我尝试在“最小工作示例”中的 main 前面添加 STAThread 属性,但出现此错误。

错误 C2337:“STAThread”:找不到属性

那么,两个问题:

  1. 我如何让“最小工作示例”正常工作和
  2. 如何让真正的应用程序正常工作?

(甚至可以在 #pragma 非托管块中添加 STAThread 属性吗?)

#pragma unmanaged
BOOL WINAPI DllMain (HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved)
{ 
...
}

【问题讨论】:

    标签: c# c++-cli interop


    【解决方案1】:

    当你是一个 DLL 时,你不能直接控制你的线程正在运行的单元——一个线程一次只能在一个单元中,所以如果调用你的 DLL 的线程已经是另一个单元,那你就不能改了。

    您是否控制调用您的 DLL 的代码?如果没有,那么我认为你能做的最好的事情就是启动你自己的线程(你可以通过CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)控制它运行的公寓)然后调用OpenFileDialog/@ 987654323@从那里。

    【讨论】:

    • 比我的答案要好得多。
    • 对我来说,使用 WPF 而不是 WinForms,只需在主函数中调用 CoInitialize(NULL) 即可解决类似的问题。在这种情况下,也没有必要(通常​​也不需要)启动一个新线程
    【解决方案2】:

    大家,

    感谢您的帮助。出于某种原因,我从未想过要启动一个新线程。

    感谢大家的花絮。由于我已经在 IJW C++/cli 领域,我认为使用 .net 框架解决问题会更好。

    一旦我意识到我需要一个新线程,就很简单了。

    我将调用 C# dll 的函数移到一个单独的类中:

    参考类 StaClass { 公开:

    System::String^ strFile;
    System::String^ strNote;
    
    void CallWiki()
    {
        WikiNotes::FrmWiki fw;
    
        fw.File = strFile;
        fw.Note = strNote;
    
        fw.ShowDialog();
    }
    

    };

    然后我使用此代码从主线程启动 STA 线程。

    wiki->strFile = gcnew System::String(File);
    wiki->strNote = gcnew System::String(Note);
    
    ThreadStart^ threadDelegate = gcnew ThreadStart(wiki, &StaClass::CallWiki);
    Thread^ newThread = gcnew Thread(threadDelegate, 0);
    newThread->SetApartmentState(ApartmentState::STA);
    newThread->Start();
    

    简单易读(至少对我而言——我是一名 .Net 程序员,我从未深入研究过 COM、MFC 和 ATL)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多