如何通过Silverlight中的COM Automation从非托管代码获取返回值?

时间:2011-01-19 14:45:00

标签: silverlight com silverlight-4.0 interop

我目前正在尝试使用提升的权限从Silverlight 4 Out-Of-browser应用程序调用一些非托管代码。

我的简单测试代码因ArgumentException而失败。

try
{
    dynamic watch = AutomationFactory.CreateObject("WatchCOMLib.HighPerformanceWatch");                

    // Displays ...AutomationMetaObjectProvider
    MessageBox.Show(watch.ToString());  


    // Fails with ArgumentException: Could not convert an argument for the call to GetTimestamp
    ulong tsc;
    watch.GetTimestamp(out tsc);  

    MessageBox.Show(tsc.ToString());
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }

我使用Visual Studio 2010 ATL模板向导创建了COM库;该方法看起来像

STDMETHODIMP CHighPerformanceWatch::GetTimestamp(ULONGLONG* tsc)
{
    // ....
    *tsc = result; // result is unsigned __int64
    return S_OK;
}

当我简单地将tsc传递给GetTimestamp而不指定out关键字时,不会抛出任何异常,但tsc保持不变。 现在......我如何从非托管库中获取值?

现在,可能缺少大量信息。我已经按照一些Hello-World教程来创建这个COM库,但我真的不知道那里有什么goig。 =) 请询问您需要的任何东西!

1 个答案:

答案 0 :(得分:2)

您是否检查过GetTimestamp的IDL定义是否将[out]属性附加到参数?