Winforms 错误C3645:\ clrcall不能用于编译为本机代码的函数

Winforms 错误C3645:\ clrcall不能用于编译为本机代码的函数,winforms,visual-studio-2010,visual-c++,sse,Winforms,Visual Studio 2010,Visual C++,Sse,我试图在VS2010的Windows窗体应用程序中使用SSE指令。在下面的链接中,我使用了sum_array的函数 但是当我编译应用程序时,它给出了以下错误 error C3645: 'plot_rectangle::Form1::sum_array' : __clrcall cannot be used on functions compiled to native code 由于我还在应用程序中使用OpenCV函数,因此我必须为此选择/clr编译器选项 那么,当我们将SSE与OpenC

我试图在VS2010的Windows窗体应用程序中使用SSE指令。在下面的链接中,我使用了sum_array的函数

但是当我编译应用程序时,它给出了以下错误

 error C3645: 'plot_rectangle::Form1::sum_array' : __clrcall cannot be used on functions compiled to native code
由于我还在应用程序中使用OpenCV函数,因此我必须为此选择/clr编译器选项

那么,当我们将SSE与OpenCV一起使用时,该错误的解决方案是什么呢

我也尝试过在pragma-like之间使用SSE指令

#pragma managed(push, off)
uint32_t sum_array(const uint8_t a[], int n)
{
    const __m128i vk0 = _mm_set1_epi8(0);       // constant vector of all 0s for use with _mm_unpacklo_epi8/_mm_unpackhi_epi8
    const __m128i vk1 = _mm_set1_epi16(1);      // constant vector of all 1s for use with _mm_madd_epi16
    __m128i vsum = _mm_set1_epi32(0);           // initialise vector of four partial 32 bit sums
    uint32_t sum;
    int i;

    for (i = 0; i < n; i += 16)
    {
        __m128i v = _mm_load_si128((const __m128i *)&a[i]);      // load vector of 8 bit values
        __m128i vl = _mm_unpacklo_epi8(v, vk0); // unpack to two vectors of 16 bit values
        __m128i vh = _mm_unpackhi_epi8(v, vk0);
        vsum = _mm_add_epi32(vsum, _mm_madd_epi16(vl, vk1));
        vsum = _mm_add_epi32(vsum, _mm_madd_epi16(vh, vk1));
                                                // unpack and accumulate 16 bit values to
                                                // 32 bit partial sum vector

    }
    // horizontal add of four 32 bit partial sums and return result
    vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
    vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4));
    sum = _mm_cvtsi128_si32(vsum);
    return sum;
}
#pragma managed(pop)
#pragma管理(推、关)
uint32求和数组(常量uint8求和[],整数n)
{
const _m128i vk0=_mm_set1_epi8(0);//与_mm_unpaclo_epi8/_mm_unpachi_epi8一起使用的所有0的常量向量
const _m128i vk1=_mm_set1_epi16(1);//与_mm_madd_epi16一起使用的所有1的常量向量
__m128i vsum=_mm_set1_epi32(0);//初始化四个部分32位和的向量
uint32_t sum;
int i;
对于(i=0;i
但同样的错误


任何人都可以帮我解决这个问题。

在编译成IL的代码中不能使用内联汇编或SSE intrinsic。解决方法很简单,将其写入一个单独的helper函数中,并用#pragma managed括起来,如下所示:

#pragma managed(push, off)
void func foo(args...)
{
   // It's fine here
   //...
}
#pragma managed(pop)

然后从Form1::sum_array()方法调用该函数。

谢谢您的回复。我还尝试了在pragma之间使用SSE代码。我还粘贴了我正在做的代码。但是得到了同样的错误。当我在包含正确的头之后尝试它时,编译很好。应该如此。您不能得到相同的错误,您肯定会得到不同的错误。谢谢您的回复。您是对的,在名称空间中声明pragma也显示了与pragma相关的错误。因此,现在它正在发挥作用。