是否可以在 C# 中使用 Microsoft 的脱机文件 API?

发布于 2024-12-08 15:29:01 字数 667 浏览 0 评论 0 原文

我试图弄清楚如何使用 离线文件 API(如果可能)。我相信,如果 API 是 COM API,那么理论上我应该能够使用以下方法从 C# 调用它 此处

不幸的是,我不知道它是否是 COM API,也不知道如何判断。 (作为更一般的旁注,谁能告诉我如何判断 API 是否与 COM 兼容?)

我已成功从 API 调用 OfflineFilesQueryStatus 函数,声明如下

[DllImport("cscapi.dll")]
public static extern int OfflineFilesQueryStatus(out bool pbActive, out bool pbEnabled);

:不确定如何使用接口(即,我不知道如何创建 IOfflineFilesCache 对象。)

任何人都可以帮我解释一下吗?

I'm trying to figure out how to use the Offline Files API from C# (if possible). I believe that if the API is a COM API, then I should theoretically be able to call it from C# using the methods here.

Unfortunately, I have no idea if it's a COM API or not, or how to tell. (As a more general side note, can anyone tell me how to tell whether an API is COM compatible?)

I've successfully called the OfflineFilesQueryStatus function from the API by declaring it like:

[DllImport("cscapi.dll")]
public static extern int OfflineFilesQueryStatus(out bool pbActive, out bool pbEnabled);

But I'm not sure how to use the interfaces (i.e., I don't know how to create an IOfflineFilesCache object.)

Can anyone help explain this to me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

亣腦蒛氧 2024-12-15 15:29:01

嗯,它说

使用类 ID CLSID_OfflineFilesCache 将此对象创建为进程内 COM 服务器。

在 C 或 C++ 中,这将是对 CoCreateObject 的调用。只需使用 CoCreateObject 的 .NET 替代品即可。我认为运行时可调用包装器/主互操作程序集应该发出元数据,让您可以使用普通的 C# new 语法来创建对象。


对于 COM 对象,使用 .NET 中的脱机文件 API 比平常更困难,MSDN 解释了原因:

遗憾的是,您无法通过在 Visual Studio 解决方案资源管理器中添加对此 COM 组件的引用来创建 MobSync.dll 互操作程序集。尝试这样做会产生错误。出现这种情况是因为 MobSync.dll 与许多 COM 组件 DLL 不同,它没有类型库 (TLB) 信息来支持嵌入其中的 COM 互操作。

.NET 依赖类型库进行互操作,但 Microsoft 仅为这些接口提供了 C/C++ 标头。通过一些 IDL 黑客攻击,您可以让它工作,请参阅创建自定义同步管理器处理程序MSDN 上的示例,其中包含“修复”mobsync.dll 的方法。您需要执行相同的步骤,但使用 cscapi/cscobj IDL。

但到目前为止,最简单且最受支持的方法是使用 C++/CLI。在那里,您可以直接#include SDK 标头,还可以定义从 C# 轻松使用的托管类型。

Well, it says

Create this object as an in-proc COM server using the class ID CLSID_OfflineFilesCache.

From C or C++, that'd be a call to CoCreateObject. Just use the .NET replacement for CoCreateObject. I thought the runtime callable wrapper / primary interop assembly was supposed to emit metadata that would let you do that using the normal C# new syntax for creating objects.


Using the Offline Files API from .NET is more difficult than usual for COM objects, MSDN explains why:

Unfortunately, you cannot create a MobSync.dll interop assembly by adding a reference to this COM component in the Visual Studio Solution Explorer. Attempting to do so produces an error. This occurs because MobSync.dll, unlike many COM component DLLs, doesn't have type library (TLB) information to support COM interop embedded inside it.

.NET relies on the type library for interop, but Microsoft only provided the C/C++ header for these interfaces. With some IDL hacking, you can get it to work, see Creating a Custom Synchronization Manager Handler sample on MSDN, which has a recipe for "fixing" mobsync.dll. You'd need to perform the same steps, but with the cscapi/cscobj IDL.

But by far the easiest and best-supported approach would be to use C++/CLI. There you can directly #include the SDK headers, and you can also define managed types easily used from C#.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文