我试图通过一个int []当为本地DLL功能作为一个指针搜索出该但没有发现任何东西,但是,是不存在仍然该DLL可以维持到指针的引用的危险,并然后尝试“固定”块终止后再次访问它?这是不是导致内存访问错误如果GC已经动了你的阵列?如果是这样,你如何解决这个问题?或者,这是不太可能的情况?

有帮助吗?

解决方案 2

下面是我提出以解决此问题的类。它创建使用AllocHGlobal在非托管的存储空间,然后包装了一个指针,它指向的空间。不幸的是使这个通用似乎并没有工作,因为没有办法,我可以找到从void*投在T方法this[int i]


    unsafe sealed class FixedFloatArray : IDisposable {
        readonly float* _floats;

        internal FixedFloatArray(int size) {
            _floats = (float*)Marshal.AllocHGlobal(sizeof(float) * size);
        }

        internal FixedFloatArray(float[] floats) {
            _floats = (float*)Marshal.AllocHGlobal(sizeof(float) * floats.Length);
            Marshal.Copy(floats, 0, (IntPtr)_floats, floats.Length);
        }

        internal float this[int i] {
            get { return _floats[i]; }
            set { _floats[i] = value; }
        }

        internal void CopyFrom(float[] source, int sourceIndex, int destinationIndex, int length) {
            var memoryOffset = (int)_floats + destinationIndex * sizeof(float);
            Marshal.Copy(source, sourceIndex, (IntPtr)memoryOffset, length);
        }

        internal void CopyTo(int sourceIndex, float[] destination, int destinationIndex, int length) {
            var memoryOffset = (int)_floats + sourceIndex * sizeof(float);
            Marshal.Copy((IntPtr)memoryOffset, destination, destinationIndex, length);
        }

        public static implicit operator IntPtr(FixedFloatArray ffa) {
            return (IntPtr)ffa._floats;
        }

        public void Dispose() {
            Marshal.FreeHGlobal((IntPtr)_floats);
        }
    }

其他提示

<强>更新:此问题是的受试者我博客在2012年12月11日。感谢伟大的问题!


  

试图寻找这个,但没有发现任何东西。

考虑阅读的语言规范,当你有关于语言问题。

  

传递的int []当为本地DLL功能作为一个指针,是不存在仍然该DLL可以维持到指针的引用,然后尝试在“固定的”块具有后再次访问它的危险终止?

是的。作为语言规范规定:


  

这是程序员的职责   确保指针所创造   固定语句不超出生存   这些语句的执行。对于   例如,当指针通过创建   固定语句传递给   外部的API,它是程序员的   有责任确保这些API   不保留任何这些指针的存储器中。


  

这是不是导致内存访问错误如果GC已经动了你的阵列?

是!

  

如果是这样,你如何解决这个问题?

你不知道。由于语言规范状态,您需要永远做。因为你永远不会做到这一点,你没有找到一个办法来解决它。这有点像问“我怎么从枪杀自己恢复?”你不 - 如果你不想落得死了,然后一个很好的规则是“你自己首先不拍”

  

或者这是不太可能的情况?

您可能编写调用违反托管代码的规则DLL的C#程序? I 的不知道!你告诉我 - 是它的那种东西,你认为你可能会做什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top