c# dll 导入入口点,带冒号/作用域

c# dll import entry point with colons / scope

希望从 vssapi.dll

导入 dll

查看 GetSnapshotDeviceName 函数和 DLL 导出查看器给我:

protected: long __cdecl CVssWriter::GetSnapshotDeviceName(unsigned short const * __ptr64,unsigned short const * __ptr64 * __ptr64)const __ptr64
protected: long __cdecl CVssJetWriter::GetSnapshotDeviceName(unsigned short const * __ptr64,unsigned short const * __ptr64 * __ptr64)const __ptr64

假设我想要第一个,我该如何声明dll导入, 例如:

[DllImport("vssapi.dll", EntryPoint = "CVssWriter::GetSnapshotDeviceName", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
private static extern uint GetSnapshotDeviceName(string wszOriginalVolume, out string ppwszSnapshotDevice);

[有或没有 ExactSpelling] 总是给我

Unable to find an entry point named 'CVssWriter::GetSnapshotDeviceName' in DLL 'vssapi.dll

错误。冒号的变化(删除等)和颠倒名称(作为装饰版本)也没有给我任何乐趣。

我知道它可以使用修饰名或序号工作,但我希望代码具有合理的可移植性(声明依赖于编译器,而且我从未见过任何表示序号在更新中保持不变的内容两者之一)。

是的,我已经知道这个 dll 不能移植到 Vista 之前的版本……我可以接受。
也听说过 AlphaVSS - 但我需要的是使用航空母舰在湖上钓鱼( - 他们真的需要让它使用起来如此笨拙吗?)

这些是C++实例方法,也就是成员函数。因此,无法使用 p/invoke 导入它们。您尝试使用的 VSS API 可作为 C++ 类 或通过 COM 使用。

如果您需要的功能可通过 COM 接口获得,那么这将是您继续操作的最简单方法。否则,您将需要以一种或另一种方式包装 C++ 类。当然,最简单的方法是使用混合模式 C++/CLI 程序集。

不管怎样,p/invoke 帮不了你。