gpt4 book ai didi

c# - MonoMac NSWorkspace.RecycleUrls 与 recycleURLs :completionHandler

转载 作者:行者123 更新时间:2023-12-03 17:04:37 24 4
gpt4 key购买 nike

根据the MonoMac documentation NSWorkspace.RecycleUrls 的签名是:

[MonoMac.Foundation.Export("recycleURLs:completionHandler:")]
public virtual void RecycleUrls (MonoMac.Foundation.NSDictionary urls, NSWorkspaceUrlHandler completionHandler)

根据Apple's documentation for NSWorkspace recycleURLs:completionHandler 的签名是:

- (void)recycleURLs:(NSArray *)URLs completionHandler:(void (^)(NSDictionary *newURLs, NSError *error))handler

我有一组想要回收的网址。

这里我被难住了 - Apple 文档说第一个参数是 NSArray 但 MonoMac 想要一个 NSDictionary。构造 NSDictionary 的所有函数都需要键值(毫不奇怪),而我只有

除了采用 MonoMac 的 RecycleUrls 实现(复制如下)并重写它以使用 NSArray 之外,还有什么可做的吗?

[Export("recycleURLs:completionHandler:")]
public unsafe virtual void RecycleUrls(NSDictionary urls, NSWorkspaceUrlHandler completionHandler)
{
if (urls == null)
{
throw new ArgumentNullException("urls");
}
if (completionHandler == null)
{
throw new ArgumentNullException("completionHandler");
}
BlockLiteral blockLiteral = default(BlockLiteral);
blockLiteral.SetupBlock(NSWorkspace.static_InnerNSWorkspaceUrlHandler, completionHandler);
if (this.IsDirectBinding)
{
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, NSWorkspace.selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr)((void*)(&blockLiteral)));
}
else
{
Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, NSWorkspace.selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr)((void*)(&blockLiteral)));
}
blockLiteral.CleanupBlock();
}

最佳答案

Mono 的绑定(bind)不正确,我更改了 NSWorkspace.RecycleUrls()NSWorkspace.DuplicateUrls() 以采用 NSArray 而不是 NSDictionarymonomac commit b1eda57 .

这是生成的代码:

    [Export ("recycleURLs:completionHandler:")]
public unsafe virtual void RecycleUrls (NSArray urls, NSWorkspaceUrlHandler completionHandler)
{
if (urls == null)
throw new ArgumentNullException ("urls");
if (completionHandler == null)
throw new ArgumentNullException ("completionHandler");
BlockLiteral *block_ptr_completionHandler;
BlockLiteral block_completionHandler;
block_completionHandler = new BlockLiteral ();
block_ptr_completionHandler = &block_completionHandler;
block_completionHandler.SetupBlock (static_InnerNSWorkspaceUrlHandler, completionHandler);

if (IsDirectBinding) {
MonoMac.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (this.Handle, selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
} else {
MonoMac.ObjCRuntime.Messaging.void_objc_msgSendSuper_IntPtr_IntPtr (this.SuperHandle, selRecycleURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
}
block_ptr_completionHandler->CleanupBlock ();

}

[Export ("duplicateURLs:completionHandler:")]
public unsafe virtual void DuplicateUrls (NSArray urls, NSWorkspaceUrlHandler completionHandler)
{
if (urls == null)
throw new ArgumentNullException ("urls");
if (completionHandler == null)
throw new ArgumentNullException ("completionHandler");
BlockLiteral *block_ptr_completionHandler;
BlockLiteral block_completionHandler;
block_completionHandler = new BlockLiteral ();
block_ptr_completionHandler = &block_completionHandler;
block_completionHandler.SetupBlock (static_InnerNSWorkspaceUrlHandler, completionHandler);

if (IsDirectBinding) {
MonoMac.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_IntPtr (this.Handle, selDuplicateURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
} else {
MonoMac.ObjCRuntime.Messaging.void_objc_msgSendSuper_IntPtr_IntPtr (this.SuperHandle, selDuplicateURLsCompletionHandler_, urls.Handle, (IntPtr) block_ptr_completionHandler);
}
block_ptr_completionHandler->CleanupBlock ();

}

快速测试:

    void TestUrls ()
{
var path = Path.GetTempFileName ();
Console.WriteLine ("TEST: {0} {1}", path, File.Exists (path));

var array = new NSMutableArray ();
var url = new NSUrl ("file://" + path);
array.Add (url);

var workspace = NSWorkspace.SharedWorkspace;
workspace.DuplicateUrls (array, (urls, error) => {
Console.WriteLine ("DUPLICATED: {0} {1}", urls, error);
array.Add (urls.Values [0]);

workspace.RecycleUrls (array, (urls2, error2) => {
Console.WriteLine ("RECYCLED: {0} {1} {2}",
urls2, error2, File.Exists (path));
});
});
}

关于c# - MonoMac NSWorkspace.RecycleUrls 与 recycleURLs :completionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13453957/

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