private Byte[] GetBinaryCertificateProperty(ref CCertServerExit server, string name)
        {
            // https://blogs.msdn.microsoft.com/alejacma/2008/08/04/how-to-modify-an-interop-assembly-to-change-the-return-type-of-a-method-vb-net/
            IntPtr variantObjectPtr = Marshal.AllocHGlobal(2048);

            try
            {
                IntPtr bstrPtr;
                int    bstrLen;

                // Get VARIANT containing certificate bytes
                // Read ANSI BSTR information from the VARIANT as we know RawCertificate property is ANSI BSTR.
                server.GetCertificateProperty(name, (int)PropertyType.PROPTYPE_BINARY, variantObjectPtr);
                bstrPtr = Marshal.ReadIntPtr(variantObjectPtr, 8);
                bstrLen = Marshal.ReadInt32(bstrPtr, -4);
                byte[] result = new byte[bstrLen];
                Marshal.Copy(bstrPtr, result, 0, bstrLen);

                return(result);
            }
            catch
            {
                return(null);
            }
            finally
            {
                VariantClear(variantObjectPtr);
                Marshal.FreeHGlobal(variantObjectPtr);
            }
        }
        private int GetLongCertificateProperty(ref CCertServerExit server, string name)
        {
            IntPtr variantObjectPtr = Marshal.AllocHGlobal(2048);

            try
            {
                server.GetCertificateProperty(name, (int)PropertyType.PROPTYPE_LONG, variantObjectPtr);
                var result = (int)(Marshal.GetObjectForNativeVariant(variantObjectPtr));
                return(result);
            }
            catch
            {
                return(0);
            }
            finally
            {
                VariantClear(variantObjectPtr);
                Marshal.FreeHGlobal(variantObjectPtr);
            }
        }