.Net运行时如何“理解”该结构仍具有参考 - c#

问题是.Net运行时如何理解使用Marshal.StructureToPtr放置到内存中的结构的字段不能被GC释放。

下面的情况。

我有以下结构:

[StructLayout(LayoutKind.Sequential)]
public struct SomeStruct
{
    public string s;
    public Stream stream;

    public SomeStruct(string s)
    {
        this.s = s;
        this.stream = new MemoryStream(0x100);
    }
}

有一种方法可以实例化结构并将其拖放到内存中:

static IntPtr GetStructRawData()
{
    IntPtr ptr = Marshal.AllocHGlobal(1024);
    Marshal.StructureToPtr(new SomeStruct("hi"), ptr, false);
    return ptr;
}

然后,我可以从原始内存中创建新结构:

IntPtr ptr = GetStructRawData();

GC.Collect();

SomeStruct struct2 = (SomeStruct)Marshal.PtrToStructure(ptr, typeof(SomeStruct));

确认struct2确实包含正确的字符串(“ hi”)和正确的流。因此,似乎存在对该字符串和struct1流的引用。但是什么是参考文献呢?运行时如何理解不得收集字符串和流?

参考方案

但是什么是参考文献呢?运行时如何理解不得收集字符串和流?

这里的string有点特殊情况。它实际上是一个受约束的字符串(通过ldstr加载),因此它已由intern表作为根。

MemoryStream但是...坦白说,它不是扎根的。您的代码天生就被破坏并且很危险,并且随时可能致命失败。可以随时收集或移动(压缩)对象,这将在非托管内存中留下损坏的引用,因为GC不在查看非托管内存。

我相信您的代码目前仅在“正常工作”,因为GC并未对您采取积极的措施。另外请记住:GC不会擦除对象;它不会擦除对象。如果GC只是决定将MemoryStream视为已收集,则如果内存在一段时间内仍然看起来还可以,则您仍然可以再次与它交谈,而不会抱怨。但这只是出于错误的原因。

在非托管内存中具有引用是一个可怕的想法,并且会伤害您。

如果您要使用非托管内存,则where T : unmanaged约束可能会为您节省生命。它可以防止您陷入这种情况,但由于必然限制了您的操作能力。含义:您不能拥有这些字段。

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

在ASP.NET MVC中创建数据库回调的最有效方法 - c#

我有一个ASP.NET MVC网页,该网页基本上通过日期过滤器显示MS SQL数据库中表的行。当新行插入数据库表时,我想用新行列表更新网页视图。实现此目标的最有效方法是什么?基本上,我想从我的JavaScript创建一个到数据库服务器的回调,以用新结果更新UI。假设数据库表中的行数很大。(〜1百万)谢谢,cas 参考方案 如果数据库更新非常频繁,则可以按特定…

如何使用JavaScript访问嵌入式ASP.NET GlobalResources? - javascript

我正在开发一个遗留的ASP.NET项目,该项目正试图缓慢地进行调整,但是如果没有像巧克力手指屋一样塌陷的情况,我将无法进行重大更改。我试图为此找到解决方案,但由于术语的特定混合(“ javascript”,“ embedded”和/或“ resource”只是为我提供了有关如何嵌入.js文件的信息,而失败了)。 。),这可能是一种怪异的处理方式。该项目将Ap…

如何使用ASP.NET ViewState使用JavaScript - c#

我的页面中有UL,它为空。我开始使用JavaScript使用LI填充它。在回发阶段如何在asp.net中使用此新添加的动态数据?那是因为我的提交按钮是asp.net控件。我不想使用JS POST。谢谢 参考方案 我过去通过在隐藏字段中填充要发布的动态数据来完成此类操作,您可以-在回传之前触发JavaScript事件,该事件将数据从UL解析到隐藏字段中要么更新…