在Marshal.StringToHGlobalUni

时间:2018-04-23 16:29:26

标签: c# delphi dll dllexport

我正在使用dllexport从Delphi调用C#编写一个DLL。

基础知识非常简单且有效,但我想公开一个返回用特定消息填充字符串的函数(不返回字符串)。我这样做的方式是Delphi向函数发送一个类型为宽字符串(LPWSTR)的指针,然后填充它。这很好用。然而,当我这样做时,我需要释放内存,这是我不确定我做对了什么的地方。 DLL构建在一个实现IDisposable的类中。这是因为我需要在函数执行后释放内存。

这是班级和这一个功能。

为了释放我分配的内存,我声明了一个全局静态intPtr,我将其作为dispose发布。这是代码。

很乐意获得任何反馈

namespace simpleDLL
{
    public class Test : IDisposable
    {
        public delegate int prog(int i);

        static IntPtr s_copy;
        bool disposed = false;
        [DllExport("getString", CallingConvention = CallingConvention.Cdecl)]
        public static int getString(out IntPtr s, [MarshalAs(UnmanagedType.LPWStr)] string str)
        {

            s_copy = (IntPtr)Marshal.StringToHGlobalUni(str);
            s = s_copy;
            return str.Length;
        }
        public void Dispose()
        {
            Dispose(true);
        }
        // Protected implementation of Dispose pattern.
        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
                return;

            if (disposing)
            {
                Marshal.FreeHGlobal(s_copy);
                // Free any other managed objects here.
                //
            }

            // Free any unmanaged objects here.
            //
            disposed = true;
        }
        ~Test()
        {
            Dispose(false);
        }
    }

0 个答案:

没有答案