c#dll使用冒号/范围导入入口点

时间:2015-06-29 05:10:18

标签: c# dllimport volume-shadow-service

希望从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]总是给我

  

无法找到名为的入口点   DLL'vssapi.dll

中的'CVssWriter :: GetSnapshotDeviceName'

错误。冒号(删除等)的变化,以及反转名称(作为装饰版本)也没有给我带来欢乐。

我知道它可以使用装饰名称或序号,但我希望代码可以合理地移植(依赖于编译器依赖,并且我从未见过的任何内容都表示会在更新中保持相同)

是的我已经知道这个dll它不会移植到Vista之前...我可以忍受。
  也听说过AlphaVSS - 但是我需要的就像使用航空母舰在湖上钓鱼一样( - 他们真的需要让它如此笨拙才能使用吗?)

1 个答案:

答案 0 :(得分:1)

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

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

无论哪种方式,p / invoke都无法帮到你。