在多线程应用程序中使用带有Media Foundation接口的P / Invoke发生AccessViolationException

凯阮

我在C#中使用P / Invoke从C ++ DLL调用本机函数,如下所示:

  1. C ++ DLL:

        extern "C"
        {
            // Function: Create Wmv video from sequences image. Codec: WMV3 (VC-1)
            __declspec(dllexport) bool __stdcall CreateWMV(...)
            {
            ...
            }
        }
    
  2. 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接口生成Wmv视频。我尝试调试,发现当我用本机代码注释掉函数IMFSinkWriter :: WriteSample()时,程序运行而不会引起异常。

因此,我想知道Microsoft在SinkWriter实现中是否有一些怪异之处。是否有人以这种方式使用Media Foundation存在相同的问题?

凯阮

按照oleksii的评论,我在下面设置:

backgroundThread.TrySetApartmentState(ApartmentState.STA); // Add this to fix createWMV() in multithreading
backgroundThread.Name = "CreateVideoThead";
backgroundThread.Start();  

现在,该程序可以毫无例外地运行。感谢C#线程ApartmentState的概念

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在对C到C#使用P / Invoke并将C struct混搭到C#时,会生成AccessViolationException,这可能是什么原因?

来自分类Dev

在电子应用程序中使用Foundation

来自分类Dev

在电子应用程序中使用Foundation

来自分类Dev

如何在多线程应用程序中使用Hibernate?

来自分类Dev

在多线程应用程序中使用随机的正确方法

来自分类Dev

当应用程序是视频源并通过网络流式传输视频时,如何使用Media Foundation?

来自分类Dev

具有单线程应用程序阻止,直到发生特定事件,然后继续

来自分类Dev

Azure Web 应用程序中的 Microsoft Media Foundation

来自分类Dev

多线程应用程序中带有Synclock语句的ConcurrentQueue(T)VS List(OfT)

来自分类Dev

在打开表单之前使用Invoke时发生InvalidOperationException

来自分类Dev

使用SinkWriter(Media Foundation)C时发生内存泄漏

来自分类Dev

在多线程C#应用程序中使用互操作的Excel文件操作失败

来自分类Dev

是否可以在多线程应用程序(MVC)中使用ServiceClient的一个实例

来自分类Dev

在多线程应用程序中使用基于openssl的pbkdf2

来自分类Dev

在多线程应用程序中使用静态变量安全吗?

来自分类Dev

使用应用程序发生奇怪的崩溃

来自分类Dev

在一个应用程序中使用多个网络接口

来自分类Dev

具有(春季)ThreadPoolTaskExecutor的多线程应用程序

来自分类Dev

具有(Spring)ThreadPoolTaskExecutor的多线程应用程序

来自分类Dev

应用程序中有很多线程适得其反吗?

来自分类Dev

“发生了未处理的错误。” 在Blazor应用程序中使用标识支架元素时

来自分类Dev

在富UI应用程序中使用WebView时发生JavaFX StackOverflowError

来自分类Dev

在独立应用程序中使用DAL和Auth时发生AttributeError

来自分类Dev

C#多线程形式的AccessViolationException

来自分类Dev

C#多线程形式的AccessViolationException

来自分类Dev

使用Java Executor接口的多线程方法

来自分类Dev

C ++:如果发生段错误或类似事件,是否有办法杀死单线程但保持应用程序运行?

来自分类Dev

使用Visual Studio多线程应用程序进行调试

来自分类Dev

在多线程应用程序中安全使用迭代器

Related 相关文章

  1. 1

    在对C到C#使用P / Invoke并将C struct混搭到C#时,会生成AccessViolationException,这可能是什么原因?

  2. 2

    在电子应用程序中使用Foundation

  3. 3

    在电子应用程序中使用Foundation

  4. 4

    如何在多线程应用程序中使用Hibernate?

  5. 5

    在多线程应用程序中使用随机的正确方法

  6. 6

    当应用程序是视频源并通过网络流式传输视频时,如何使用Media Foundation?

  7. 7

    具有单线程应用程序阻止,直到发生特定事件,然后继续

  8. 8

    Azure Web 应用程序中的 Microsoft Media Foundation

  9. 9

    多线程应用程序中带有Synclock语句的ConcurrentQueue(T)VS List(OfT)

  10. 10

    在打开表单之前使用Invoke时发生InvalidOperationException

  11. 11

    使用SinkWriter(Media Foundation)C时发生内存泄漏

  12. 12

    在多线程C#应用程序中使用互操作的Excel文件操作失败

  13. 13

    是否可以在多线程应用程序(MVC)中使用ServiceClient的一个实例

  14. 14

    在多线程应用程序中使用基于openssl的pbkdf2

  15. 15

    在多线程应用程序中使用静态变量安全吗?

  16. 16

    使用应用程序发生奇怪的崩溃

  17. 17

    在一个应用程序中使用多个网络接口

  18. 18

    具有(春季)ThreadPoolTaskExecutor的多线程应用程序

  19. 19

    具有(Spring)ThreadPoolTaskExecutor的多线程应用程序

  20. 20

    应用程序中有很多线程适得其反吗?

  21. 21

    “发生了未处理的错误。” 在Blazor应用程序中使用标识支架元素时

  22. 22

    在富UI应用程序中使用WebView时发生JavaFX StackOverflowError

  23. 23

    在独立应用程序中使用DAL和Auth时发生AttributeError

  24. 24

    C#多线程形式的AccessViolationException

  25. 25

    C#多线程形式的AccessViolationException

  26. 26

    使用Java Executor接口的多线程方法

  27. 27

    C ++:如果发生段错误或类似事件,是否有办法杀死单线程但保持应用程序运行?

  28. 28

    使用Visual Studio多线程应用程序进行调试

  29. 29

    在多线程应用程序中安全使用迭代器

热门标签

归档