C# 尝试读取或写入受保护内存时发生异常(不带调试,但不带调试)

C# 尝试读取或写入受保护内存时发生异常(不带调试,但不带调试),c#,visual-studio-2013,c++-cli,.net-4.5,access-violation,C#,Visual Studio 2013,C++ Cli,.net 4.5,Access Violation,这个问题的衍生物肯定被问到了,但我还没有找到一个符合我的情况 我创建了一个库,它正在包装一个第三方C++库并将其提供给一些内部系统。创建的库使用C++/CLI允许用户通过C#访问它。该库可以使用我们的内部持续集成NuGet服务器构建并启动,因此可以使用它 使用“启动调试”(F5)运行程序时,在其他应用程序/系统中使用此库没有问题,但每当使用“启动而不调试”(Ctrl+F5)或通过可执行文件运行时,会引发以下异常: Unhandled Exception: System.AccessViolati

这个问题的衍生物肯定被问到了,但我还没有找到一个符合我的情况

我创建了一个库,它正在包装一个第三方C++库并将其提供给一些内部系统。创建的库使用C++/CLI允许用户通过C#访问它。该库可以使用我们的内部持续集成NuGet服务器构建并启动,因此可以使用它

使用“启动调试”(F5)运行程序时,在其他应用程序/系统中使用此库没有问题,但每当使用“启动而不调试”(Ctrl+F5)或通过可执行文件运行时,会引发以下异常:

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

at TheirLib.func(Int32 , Int32 , Double* , Int32 , Int32* , Int32* , Double* , Int32 , TheirLibError* )
at MyLib.Func(Int32 n, Int32 m, Double[] x, Int32 tdx, Int32[] svar, Int32[] sobs, Double[] corr, Int32 tdc)
at SomeApplication.Program.Main(String[] args) in d:\SomeApplication\SomeApplication\Program.cs:line 67
我在这里读到()一个人可能需要.NET4.5.2,但这并没有改变任何事情。我还认为我的C++/CLI库中可能有一些设置可以让我绕过这个问题,但我没有找到任何东西,我觉得我已经到处找过了。我还查看了准备调用第三方库时使用的pin_ptr对象的C++/CLI代码,但看起来一切正常(见下文)

void MyLib::Func(int n,int m,数组^x,int tdx,数组^svar,数组^sobs,
数组^corr,int-tdc)
{
//设置输入参数
pin_ptr xPtr=&(x[0]);
引脚ptr svarPtr=&(svar[0]);
pin_ptr sobsPtr=&(sobs[0]);
pin_ptr corrPtr=&(corr[0]);
他们的错误失败;
//调用他们库的函数
func(n、m、xPtr、tdx、svarPtr、sobsPtr、corrPtr、tdc和fail);
}

同样,该库在“开始调试”时完全按照预期工作,并通过了一组详尽的测试,但我无法理解为什么这不能独立工作。。。在这一点上,我会尝试任何方法来让它工作。帮帮我吧,你是我唯一的希望…

在联系库所有者后,问题是
他们的权限未正确初始化,并且此结构中包含的指针未在库中正确处理。正确初始化后,一切都按预期进行


故事的寓意是,询问图书馆所有者,当遇到AccessViolationException时,他们的图书馆是否持有指针或任何其他指针行为。

为什么会投反对票?如果问题/问题不清楚,或者有解决方案,我更愿意听他们说,而不是只接受反对票…我担心你不会得到太多帮助,错误似乎在第三方库中。。。你是否仔细检查了阵列是否足够大?我想其中一个参数是项目计数,您检查过它的值吗?在这里帮不上什么忙:/@Lucas:那么从MyLib::Func来看,您认为这是正确初始化pin_ptr对象吗?您是否看到了与您通常看到的不一致的内容?如果
func
没有抓住任何指针,那么您的代码就可以了。不过,我希望其中一个参数类似于
x->Length
。o如果第三方库保留了一个指针供以后重用,那么您将遇到的错误是意料之中的-只要
pin_ptr
超出范围,您的数组就可以由GC在内存中自由移动。如果需要长期固定(这很糟糕),则必须使用
GCHandle
。我刚刚联系了库所有者,询问
func
是否保留任何指针。当我找到解决方案时,我一定会发布它。
void MyLib::Func(int n, int m, array<double>^ x, int tdx, array<int>^ svar, array<int>^ sobs,
    array<double>^ corr, int tdc)
{
    // Setup input parameters
    pin_ptr<double> xPtr = &(x[0]);
    pin_ptr<int> svarPtr = &(svar[0]);
    pin_ptr<int> sobsPtr = &(sobs[0]);
    pin_ptr<double> corrPtr = &(corr[0]);
    TheirLibError fail;

    // Call their library's function
    func(n, m, xPtr, tdx, svarPtr, sobsPtr, corrPtr, tdc, &fail);
}