Tag: pinning

在P / Invoke中为固定字符串传递什么?

假设这个C函数: void do_something(const char* str) 它将字符串存储在某处以供以后参考 。 此外,我在C#中有这个签名来调用这个函数: [DllImport(“NativeLib”)] static extern void do_something(string str); 现在,将字符串传递给此方法时需要做什么: 我是否需要固定字符串(使用GCHandle.Alloc() )(或者是编组创建副本)? 如果我确实需要固定它,我是否传递“原始”字符串(即我传递给GCHandle.Alloc()的字符串)? 或者我是否需要传递GCHandle.AddrOfPinnedObject()的返回值? 在这种情况下, string是正确的数据类型(对于do_something )吗? 或者我应该使用IntPtr吗?

如何防止应用程序被固定在Windows 7中?

我试图阻止用户将我的.NET应用程序固定到任务栏。 我在Old New Thing上发现了一些代码。 但是,它是在C ++中。 #include #include #include HRESULT MarkWindowAsUnpinnable(HWND hwnd) { IPropertyStore *pps; HRESULT hr = SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps)); if (SUCCEEDED(hr)) { PROPVARIANT var; var.vt = VT_BOOL; var.boolVal = VARIANT_TRUE; hr = pps->SetValue(PKEY_AppUserModel_PreventPinning, var); pps->Release(); } return hr; } BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpcs) { MarkWindowAsUnpinnable(hwnd); return TRUE; } 我很难将它转换为c#。 有人可以帮忙吗?

在传递给非托管代码之前固定updateble结构?

我使用一些旧的API,需要将结构的指针传递给异步运行的非托管代码。 换句话说,在我将struct指针传递给非托管代码之后,非托管代码会复制指针并立即返回。 非托管代码可以在后台访问该结构,在另一个线程中。 我无法控制在另一个线程和线程本身中运行的非托管代码。 fixed {}语句不能用于固定,因为它不是为异步非托管固定而设计的。 GCHandle只能引用引用,因此结构必须加框以使用GCHandle。 我试过了,它的确有效。 它的主要问题是您无法从托管代码更新结构。 要更新结构,首先我们需要将其取消装箱,然后更新,然后重新装箱,但是……哎呀……再次装箱?!? 这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码…不适用于我的案件。 如何在没有固定{}语句的情况下在内存中固定结构,以便我可以在不更改指针的情况下从托管代码更新它? 谢谢。 编辑: 只是想…有没有办法固定包含结构的父对象,然后获取结构的指针而不是容器对象?

在C#中手动取消固定byte ?

在下面的代码中,似乎client.Connect.Receive永久地固定“byte []结果”,导致永远不会释放内存(因为它总是被固定)。 我正在寻找一种方法来告诉C#在使用它之后不再需要固定它.OnReceive,但我找不到内置函数或关键字来执行此操作。 有谁知道如何让C#取消固定byte []数组? (这是我的C#应用​​程序中的内存泄漏源之一) this.m_TcpListener = new TcpListener(this.p_TcpEndPoint.Port); this.m_TcpThread = new Thread(delegate() { try { this.m_TcpListener.Start(); while (this.p_Running) { TcpClient client = this.m_TcpListener.AcceptTcpClient(); new Thread(() => { try { // Read the length header. byte[] lenbytes = new byte[4]; int lbytesread = client.Client.Receive(lenbytes, 0, 4, SocketFlags.None); if (lbytesread != 4) return; // drop […]

我需要固定匿名代表吗?

我从C#应用程序调用CopyFileEx,并将匿名委托传递给LPPROGRESS_ROUTINE参数,以便获取有关文件复制进度的通知。 我的问题是,匿名代表是否需要固定以及为什么(或为什么不)。 此外,如果: CopyFileEx没有阻止。 如果我传入一个非匿名的代表。 谢谢!