我正在使用C#中的P / Invoke从C ++ DLL调用本机函数,如下所示:
C ++ DLL:
extern "C"
{
// Function: Create Wmv video from sequences image. Codec: WMV3 (VC-1)
__declspec(dllexport) bool __stdcall CreateWMV(...)
{
...
}
}
C#包装器类。我创建了C#包装类函数来映射本机C ++代码:
[DllImport("AVIEncoder.dll", EntryPoint = "CreateWMV", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool createWmv(...);
我确信参数在C#中正确编组,因为当我直接在客户端C#代码中调用时它会成功运行。 这个问题只发生在我将函数放在后台线程中时。
private void Test()
{
....
createWmv(...); // This call was processed without issue
Thread backgroundThread = new Thread(
new ThreadStart(()=>
{
createWmv(...); // This call causes AccessViolationException
}
}
createWmv()函数使用Media Foundation Interface生成Wmv视频。我尝试调试,我发现当我在本机代码中注释掉函数IMFSinkWriter :: WriteSample()时,程序运行时不会导致异常。
因此,我想知道微软是否在SinkWriter实现中有些奇怪。 有没有人以这种方式使用Media Foundation有同样的问题?
答案 0 :(得分:1)
关注oleksii的评论,我在下面提到:
backgroundThread.TrySetApartmentState(ApartmentState.STA); // Add this to fix createWMV() in multithreading
backgroundThread.Name = "CreateVideoThead";
backgroundThread.Start();
现在,该程序可以毫无例外地运行。感谢C#threading中的ApartmentState概念。