C#interop - 验证对象存在

时间:2009-06-25 06:39:31

标签: c# validation com interop

我想在我的应用程序中使用COM对象 如何确保对象已在机器中注册?

我找到的唯一解决方案(也是on SO)是在初始化时使用try-catch块:

try {
    Foo.Bar COM_oObject = new Foo.Bar();
} catch (Exception ee) {
    // Something went wrong during init of COM object
}

我可以用其他任何方式吗? 我觉得通过期待和报告错误来处理错误是错误的,我宁愿知道我会失败并避免它开始。

4 个答案:

答案 0 :(得分:6)

您正在以正确的方式使用异常处理:从您知道如何恢复的特定情况中优雅地失败。

在这种情况下使用try-catch没有问题,但你至少可以更具体地捕获:ComException。

答案 1 :(得分:1)

“我认为通过期待并报告错误来处理错误是错误的”

这不是try-catch的目的吗?顺便说一下,当一些非常糟糕的事情发生时会发生异常,并且因为你所指的COM对象未被注册是一件非常糟糕的事情,因此,异常是一个完美的解决方案。并且您无法以任何其他方式处理异常。

我认为这是正确的做法。

答案 2 :(得分:1)

如果您知道组件的ProgId。你可以尝试这个技巧

comType = Type.GetTypeFromProgID(progID,true/*throw on error*/);

答案 3 :(得分:0)

如果你这么做并且希望你有一个非异常的投掷等价物,试试:

public static class Catching<TException> where TException : Exception
{
    public static bool Try<T>(Func<T> func, out T result)
    {
        try
        {
            result = func();
            return true;
        }
        catch (TException x) 
        {
            // log exception message (with call stacks 
            // and all InnerExceptions)
        }

        result = default(T);
        return false;
    }

    public static T Try<T>(Func<T> func, T defaultValue)
    {
        T result;
        if (Try(func, out result))
            return result;

        return defaultValue;
    }
}

所以现在你可以这样做:

Foo.Bar newObj;
if (!Catching<ComException>.Try(() => new Foo.Bar(), out newObj))
{
    // didn't work.
}

或者,如果您在defaultMyInterface中存储了默认对象,那么如果没有更好的方法,您将使用它来实现接口:

IMyInterface i = Catching<ComException>.Try(() => new Foo.Bar() as IMyInterface,
                                            defaultMyInterface);

您也可以在完全不同的情况下执行此操作:

int queueSize = Catching<MyParsingException>
    .Try(() => Parse(optionStr, "QueueSize"), 5);

如果Parse抛出MyParsingException,则queueSize将默认为5,否则将使用Parse返回的值(或任何其他异常将传播通常,这通常是您想要的意外异常。)

这有助于避免分解代码流,并且还集中了您的日志记录策略。