相关疑难解决方法(0)

如何从控制台应用程序处理COM事件?

我正在使用来自第三方库的COM对象来生成定期事件.当我使用Winforms应用程序中的库,将对象作为类成员并在主窗体线程中创建它时,一切正常.但是,如果我从另一个线程创建对象,我不会收到任何事件.

我的猜测是我需要在用于创建对象的同一个线程中有某种事件循环.

我需要从控制台应用程序中使用此对象.我想我可以使用Application.DoEvents,但我宁愿不在控制台App中包含Winforms命名空间.

我怎么解决这个问题?

更新3(2011-06-15):供应商终于回答了.简而言之,他们说Application.Run创建的消息泵与Thread.Join创建的消息泵之间存在一些差异,但他们不知道这有什么区别.

我同意他们; 任何关于此事的光明都会非常感激.

更新:

从理查德评论到mdm回答:

如果其他组件是单线程并从MTA实例化,则Windows将创建工作线程+窗口+消息泵并执行必要的编组.

试着听从他的建议,我正在做以下事情:

更新2:

我改变了JoãoAngelo回答后的代码.

using System;

namespace ConsoleApplication2
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            MyComObjectWrapper wrapper = new MyComObjectWrapper();
        }
    }

    class MyComObjectWrapper
    {
        MyComObject m_Object;
        AutoResetEvent m_Event;

        public MyComObjectWrapper()
        {
            m_Event = new System.Threading.AutoResetEvent(false);

            System.Threading.Thread t = new System.Threading.Thread(() => CreateObject());
            t.SetApartmentState (System.Threading.ApartmentState.STA);
            t.Start();

            Wait();
        }

        void ObjectEvt(/*...*/)
        {
            // ...
        }

        void Wait()
        {
            m_Event.WaitOne();
        }

        void CreateObject()
        {
            m_Object = new MyComObject();
            m_Object.OnEvent …
Run Code Online (Sandbox Code Playgroud)

c# com events interop

12
推荐指数
2
解决办法
4835
查看次数

遗留代码以某种方式对ThreadAbortException作出反应的单元测试

我有一些遗留代码,我想要进行测试.这是必需品的复制品:

public class LegacyUnit
{
    private readonly ICollaborator collaborator;

    public LegacyUnit(ICollaborator collaborator) 
    {
        this.collaborator = collaborator;
    }

    public object GetStuff(HttpContextBase context, string input)
    {
        try 
        {
            if (input == "")
            {
                context.Response.End();
            }

            collaborator.DoOtherStuff();

            return "Done!";
        }
        catch (ThreadAbortException) 
        { }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这个遗留单元存在一些问题,但是现在我只是试图让它受到考验.具体来说,我想测试,如果提出a ,collaborator.DoOtherStuff不会调用.Response.End()ThreadAbort

问题:你如何提出这样的例外?

我已经阅读了这个问题及其答案ThreadAbortException,并了解它的特殊之处.但是,我从这些帖子中看不到如何在单元测试中处理这个问题.

这是我的尝试:

[Test]
public void DoesNotCallCollaboratorOnThreadAbort()
{
    var testResponseMock = new Mock<HttpResponseBase>();
    var testContextMock = new Mock<HttpContextBase>();
    var collaboratorMock = new Mock<ICollaborator>();

    testContextMock.Setup(x …
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing moq threadabortexception

3
推荐指数
1
解决办法
283
查看次数

标签 统计

c# ×2

.net ×1

com ×1

events ×1

interop ×1

moq ×1

threadabortexception ×1

unit-testing ×1