Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Blow program can read mutiple results:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1 {

[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct MultResultsType
{
    public int  iEntryID;      // from NHRList.txt
    public int  iReturnValue;  // success/failure
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst =40)]
    public string pszReportKey;
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst = 40)]
    public string pszRowKey;
}
class Program
{
    [DllImport("kernel32.dll")]
    public extern static IntPtr LoadLibrary(string dllToLoad);
    [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
    public extern static IntPtr GetProcAddress(IntPtr hModule, string procedureName);
    [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
    public extern static bool FreeLibrary(IntPtr hModule);
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate long D2R_GetSingleResult([MarshalAs(UnmanagedType.LPStr)]string pszDOE2Dir,
        [MarshalAs(UnmanagedType.LPStr)]string pszFileName,
        int iEntryID,
        float[] pfData,
        int iMaxValues,
        [MarshalAs(UnmanagedType.LPStr)]string pszReportKey,
        [MarshalAs(UnmanagedType.LPStr)]string pszRowKey);

    private delegate long D2R_GetMultipleResult([MarshalAs(UnmanagedType.LPStr)]string pszDOE2Dir,
        [MarshalAs(UnmanagedType.LPStr)]string pszFileName,
        int iFileType,
        //[MarshalAs(UnmanagedType.LPArray)]
        float[] pfData,
        int iMaxValues,
        int iNumMRTs,
        [In,Out]IntPtr pMRTs);

    unsafe public static  IntPtr MarshalArray(ref MultResultsType[] bodies)
    {
        int iSizeOfOneBodyPos = Marshal.SizeOf(typeof(MultResultsType));
        int iTotalSize = iSizeOfOneBodyPos * bodies.Length;
        IntPtr pUnmanagedBodies = Marshal.AllocHGlobal(iTotalSize);
        byte* pbyUnmanagedBodies = (byte*)(pUnmanagedBodies.ToPointer());

        for (int i = 0; i < bodies.Length; i++, pbyUnmanagedBodies += (iSizeOfOneBodyPos))
        {
            IntPtr pOneBodyPos = new IntPtr(pbyUnmanagedBodies);
            Marshal.StructureToPtr(bodies[i], pOneBodyPos, false);
        }

        return pUnmanagedBodies;
    }

    static void Main(string[] args)
    {
        // Dynamically Load Library
        var pDll = LoadLibrary("D2Result.dll"); // Path to D2Result.dll
        // Get Address of Function
        var pFunctionAddress = GetProcAddress(pDll, "D2R_GetMultipleResult");
        // Instantiate Delegate
        D2R_GetMultipleResult D2R_GetMultipleResult = (D2R_GetMultipleResult)Marshal.GetDelegateForFunctionPointer(pFunctionAddress, typeof(D2R_GetMultipleResult));

        string pszDOE2Dir = "doe22\\exent.ref\\"; // Insert path to DOE-2 Dir i.e "C:\\DOE-2\\
        string pszFileName = "Project 10\\Project 10 - Baseline Design"; // Insert file path of where the input and run files are kept

        float[] pfData = new float[1] ;
        //string pszReportKey = null;
        //string pszRowKey = null;
        MultResultsType[] MRTs=new MultResultsType[4];
        MRTs[0].iEntryID = 2309007;    // EM1 array from PS-F
        MRTs[0].pszReportKey = "EM1";
        MRTs[0].pszRowKey = "";

        MRTs[1].iEntryID = 2309007;    // FM1 array from PS-F
        MRTs[1].pszReportKey = "FM1";
        MRTs[1].pszRowKey = "";

        MRTs[2].iEntryID = 2305005;    // Elec Mtr Totals from PS-E
        MRTs[2].pszReportKey = "";
        MRTs[2].pszRowKey = "";
        IntPtr pt = MarshalArray(ref MRTs);

        float[] fResults=new float[39];
        long lRetVal = D2R_GetMultipleResult(
                             pszDOE2Dir,
                             pszFileName,
                             1, fResults, 39, 3, pt);

        for (int i = 0; i < 39;i++ )
            Console.WriteLine("pfData is {0}", fResults[i]);

        bool freedom = FreeLibrary(pDll);
        Console.ReadKey();
    }
}

}