C# 可以在C中使用微软的离线文件API吗?

C# 可以在C中使用微软的离线文件API吗?,c#,com,C#,Com,如果可能的话,我正试图弄清楚如何使用C中的。我相信如果API是一个COM API,那么理论上我应该能够使用这些方法从C调用它 不幸的是,我不知道它是否是一个COM API,也不知道如何判断。作为一个更一般的旁注,谁能告诉我如何判断API是否与COM兼容 我已经成功地从API调用了OfflineFileQueryStatus函数,声明如下: [DllImport("cscapi.dll")] public static extern int OfflineFilesQueryStatus(out

如果可能的话,我正试图弄清楚如何使用C中的。我相信如果API是一个COM API,那么理论上我应该能够使用这些方法从C调用它

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

我已经成功地从API调用了OfflineFileQueryStatus函数,声明如下:

[DllImport("cscapi.dll")]
public static extern int OfflineFilesQueryStatus(out bool pbActive, out bool pbEnabled);
但我不知道如何使用接口,也就是说,我不知道如何创建IOFFlineFileCache对象

有人能帮我解释一下吗?

嗯,上面说

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

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

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

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

.NET依赖类型库进行互操作,但Microsoft仅为这些接口提供了C/C++头。通过一些IDL攻击,您可以让它工作,请参阅,它有一个修复mobsync.dll的方法。您需要执行相同的步骤,但是使用cscapi/cscobjidl


但到目前为止,最简单和最受支持的方法是使用C++/CLI。在这里,您可以直接包含SDK头,还可以定义易于从C使用的托管类型。

这绝对是一个COM API。正如您链接的文档所述,基于COM的脱机文件API接口可用于执行所有其他脱机文件操作。另外,如果您使用的是C4.0,您可能想阅读一下,看看自您链接的那篇旧文章以来COM互操作是如何变化的。谢谢@Ben。我可能完全误解了COM的工作原理,但如果它是COM组件,我是否应该在我的项目中添加对dll的引用?尝试时,我得到:无法添加对“C:\Windows\System32\cscobj.dll”的引用。请确保该文件是可访问的,并且是有效的程序集或COM组件。@Eric:您应该添加对COM组件的引用,而不是对DLL的引用,它使用注册表中的信息以及类型库中的信息。但是,我在COM组件列表中没有看到任何脱机文件,尽管它确实显示在OLEView中。