题
我引用一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();
不隶属于 StackOverflow