C# 固定结构以避免AccessViolationException

C# 固定结构以避免AccessViolationException,c#,dll,access-violation,C#,Dll,Access Violation,我从运行时加载的DLL(使用LoadLibrary())调用函数。 这个DLL是用C++编写的,我的代码是C语言。 API需要结构指针。我传递的是“ref”而不是指针 在执行此操作时,我得到了“AccessViolationException”。在谷歌搜索了3天后,我认为这个问题可以通过固定结构来解决,这样GC就不会干扰它。 (见:) 我的问题是,我可以在不使用任何指针的情况下固定结构吗?因为我不想向函数传递指针 代码如下: public class TestClass { [S

我从运行时加载的DLL(使用LoadLibrary())调用函数。 这个DLL是用C++编写的,我的代码是C语言。 API需要结构指针。我传递的是“ref”而不是指针

在执行此操作时,我得到了“AccessViolationException”。在谷歌搜索了3天后,我认为这个问题可以通过固定结构来解决,这样GC就不会干扰它。 (见:)

我的问题是,我可以在不使用任何指针的情况下固定结构吗?因为我不想向函数传递指针

代码如下:

    public class TestClass
    {
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]      
 public struct MsgFormat
{
  public Int32 MsgID;
public Int32 RxID;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=13)]
public Char[] MsgData;
}

unsafe public delegate Int32 ReadMessage(Int32 ConnectID,ref MsgFormat Message);
ReadMessage fp_ReadMessage;


void Connection()
{
IntPtr pDLLHandle;

pDLLHandle=LoadLibrary(Connect.dll);  // Load Required DLL

IntPtr fPtr= GetProcAddress(pDLLHandle,"ReadMessage"); 
fp_ReadMessage=(ReadMessage)Marshal.GetDelegateForFunctionPointer(fPtr,typeof(ReadMessage)); // Get Function Pointer for API
}

void Read()
{
  MsgFormat Rx_Msg=new MsgFormat();
  Int32 nReturnValue;
  Int32 nConnectID=0;  // Value is assigned for Testing the Function
/* Also Tried:
  Rx_Msg.MsgData=new Char[13];  */ 
nReturnValue= fp_ReadMessage(nConnectID,ref Rx_Msg);  // "ReadMessage" will return info in Rx_Msg;
/*调用fp_ReadMessage会给我“AccessViolationException”。我已经尝试过使IntPtr的引用甚至超过IntPtr.Zero,但我仍然得到了错误*/

}
    }
}
问候,,
斯瓦南德

我认为钉在这里对你没有帮助。CLR将确保传递给互操作调用的任何参数在调用返回之前不会在内存中移动

因此,当您需要执行一些手动固定时,唯一的情况是您调用的函数存储指针并稍后写入


要了解访问冲突的原因,我们需要有关正在调用的本机函数的更多信息(如函数签名)。

函数签名是外部“C”长WINAPI ReadMessage(未签名的长连接ID,MsgFormat*pMsg);我不知道关于这个函数的更多信息,因为我把它作为API。谢谢你的帮助。我还应该给你什么?任何人请帮助我!!