我引用一COM结构开始作如下:

[scriptable, uuid(ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e)]
interface nsICacheSession : nsISupports
{
    /**
     * Expired entries will be doomed or evicted if this attribute is set to
     * true.  If false, expired entries will be returned (useful for offline-
     * mode and clients, such as HTTP, that can update the valid lifetime of
     * cached content).  This attribute defaults to true.
     */
    attribute PRBool doomEntriesIfExpired;
...

资料来源:http://dxr.proximity.on.ca/dxr/mozilla-central/netwerk/cache/public/nsICacheSession.idl.html#58

我找到代码,用于进口,接口进入我的C#应用程序。代码必须是错误的,虽然,作为 set 方法似乎并不是有用,也引发了一个错误,当我试着叫它只是来看看会发生什么:

[Guid("ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsICacheSession
{
    [return: MarshalAs(UnmanagedType.Bool)]
    void set_doomEntriesIfExpired();
    [return: MarshalAs(UnmanagedType.Bool)]
    bool get_doomEntriesIfExpired();
...

什么是正确的方式来设置的价值 doomEntriesIfExpired 和我如何参考这个从我的代码?

编辑

我改变了我的码下面,这产生了"系统。AccessViolationException:试图阅读或写入受保护的存储器或亚达...":

[Guid("ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsICacheSession
{
    void set_doomEntriesIfExpired(bool enabled);
    bool get_doomEntriesIfExpired();
...
有帮助吗?

解决方案

回答你插入是好的。在COM互操作弹球都封送作为VARIANT_BOOL默认情况下所以你的外MarshalAs属性以告诉封送拆收器使用一个标准的4个字节BOOL类型是正确的,虽然吸气等式的一部分需要的属性增加。

在一般情况下,我想离开定义的属性的接口,作为的属性而不是破坏它们出入他们的吸气,并制定者。它相匹配的义的接口更好的定义,并且通常更易于阅读。你应该能够重新写入你的COM进口的定义如下保留的属性质的doomEntriesIfExpired:

[Guid("ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e"), ComImport, 
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsICacheSession
{

    bool doomEntriesIfExpired 
    { 
        [param:MarshalAs(UnmanagedType.Bool)]set; 
        [return:MarshalAs(UnmanagedType.Bool)]get; 
    }

...

其他提示

事实上,你状态 [return: MarshalAs(UnmanagedType.Bool)] 你的 void set 方法显然是一种误差源。

这就是说,我管理,代码C++mozilla插件没有[返回...]标签。idl,例如:

[scriptable, uuid(ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e)]
interface nsICacheSession : nsISupports
{
    void set_doomEntriesIfExpired(in bool value);
    bool get_doomEntriesIfExpired();
}

对了,你确定你可以代码一nsi插在C#?

原来答案如下:

[Guid("ae9e84b5-3e2d-457e-8fcd-5bbd2a8b832e"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsICacheSession
{
    void set_doomEntriesIfExpired([In, MarshalAs(UnmanagedType.Bool)] ref bool enabled);
    bool get_doomEntriesIfExpired();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top