gpt4 book ai didi

c# - PInvoke - 如何表示来自 COM 接口(interface)的字段

转载 作者:行者123 更新时间:2023-11-30 01:32:29 29 4
gpt4 key购买 nike

我正在引用一个如下开头的 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;
...

Source: http://dxr.proximity.on.ca/dxr/mozilla-central/netwerk/cache/public/nsICacheSession.idl.html#58

我找到了将该接口(interface)导入我的 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 值的正确方法是什么?如何从我的代码中引用它?

编辑

我将我的代码更改为以下内容,它产生了“System.AccessViolationException:尝试读取或写入 protected 内存 yada yada ...”:

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

最佳答案

您插入的答案很好。在 COM Interop 中, bool 值默认编码(marshal)为 VARIANT_BOOL,因此您添加 MarshalAs 属性以告诉编码(marshal)拆收器使用标准 4 字节 BOOL 类型是正确的,尽管等式的 getter 部分也需要添加该属性。

一般来说,我喜欢将接口(interface)中定义的属性保留为属性,而不是将它们分解为它们的 getter 和 setter。它更好地匹配接口(interface)定义的语义,通常也更容易阅读。您应该能够如下重写 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;
}

...

关于c# - PInvoke - 如何表示来自 COM 接口(interface)的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606530/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com