【问题标题】:Importing C++ dll function in C#在 C# 中导入 C++ dll 函数
【发布时间】:2016-05-23 21:07:23
【问题描述】:

我想调用 MediaInfo.dll 中的一个函数。

函数是:

const wchar_t*     __stdcall MediaInfo_Option (void* Handle, const
wchar_t* Option, const wchar_t* Value);

我是这样在c#代码中声明的:

[DllImport("MediaInfo.dll", CharSet = CharSet.Unicode)] internal
static extern string MediaInfo_Option(IntPtr Handle, string OptionString, string Value);

这是调用它的代码:

MediaInfo.MediaInfo_Open(this.h, path);
MediaInfo.MediaInfo_Option(this.Handle, "Complete", "1");
myTextBox.Text = MediaInfo.MediaInfo_Inform(this.h, 0);
MediaInfo.MediaInfo_Close(this.h);

问题是任何使用 .NET Framework 编译的等于或高于版本 4 的 c# 应用程序在调用该函数时都会崩溃。

我该如何解决?

提前致谢。

【问题讨论】:

  • 您不能将返回类型声明为 string,pinvoke marshaller 将尝试释放本机字符串的内存,但结果不太可能很好。改用 IntPtr,用 Marshal.PtrToStringUni() 恢复字符串。然后跪下来祈祷你实际上不必松开绳子。
  • 您还引用了 64 位版本的 MediaInfo.DLL,它可能是也可能不是您想要的
  • @Hans Passant 谢谢!现在效果很好!
  • @Plutonix 是的,我不应该这样做吗?

标签: c# .net function frameworks mediainfo


【解决方案1】:

你没有 Marshall 输入和输出的 wchar_t*,你会得到随机错误。

有一个C# binding of MediaInfo 负责处理所有丑陋的东西。 您可以将其与 C# example of MediaInfo 一起使用。
您可能有兴趣下载DLL package with a C# example project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多