private Object CreateCertificateRequest(Object subject, Object issuer, Object privateKey, Object keyUseSection, Object hashAlgorithm)
{
// Create the self signing request
//CX509CertificateRequestCertificate lCertificateRequest = new CX509CertificateRequestCertificate();
Type lCertificateRequestCertificateType = Type.GetTypeFromProgID("X509Enrollment.CX509CertificateRequestCertificate");
Object lCertificateRequest = Activator.CreateInstance(lCertificateRequestCertificateType);
//lCertificateRequest.InitializeFromPrivateKey(X509CertificateEnrollmentContext.XCN_CONTEXT_USER, lPrivateKey, "");
lCertificateRequestCertificateType.InvokeMember("InitializeFromPrivateKey", BindingFlags.InvokeMethod, null, lCertificateRequest,
new Object[] { XCN_CONTEXT_USER, privateKey, "" });
//lCertificateRequest.Subject = lSubjectDN;
lCertificateRequestCertificateType.InvokeMember("Subject", BindingFlags.SetProperty, null, lCertificateRequest, new Object[] { subject });
//lCertificateRequest.Issuer = lIssuerDN;
lCertificateRequestCertificateType.InvokeMember("Issuer", BindingFlags.SetProperty, null, lCertificateRequest, new Object[] { issuer });
//lCertificateRequest.NotBefore = DateTime.Now;
lCertificateRequestCertificateType.InvokeMember("NotBefore", BindingFlags.SetProperty, null, lCertificateRequest, new Object[] { this.GetCertificateStartDate() });
//lCertificateRequest.NotAfter = DateTime.Now.AddYears(10);
lCertificateRequestCertificateType.InvokeMember("NotAfter", BindingFlags.SetProperty, null, lCertificateRequest, new Object[] { this.GetCertificateEndDate() });
//lCertificateRequest.X509Extensions.Add((CX509Extension)lKeyUsage);
Object lExtensions = lCertificateRequestCertificateType.InvokeMember("X509Extensions", BindingFlags.GetProperty, null, lCertificateRequest, new Object[] { });
lExtensions.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, lExtensions, new Object[] { keyUseSection });
//lCertificateRequest.HashAlgorithm = lHashAlgorithm;
lCertificateRequestCertificateType.InvokeMember("HashAlgorithm", BindingFlags.SetProperty, null, lCertificateRequest, new Object[] { hashAlgorithm });
//lCertificateRequest.SuppressDefaults = true;
lCertificateRequestCertificateType.InvokeMember("SuppressDefaults", BindingFlags.SetProperty, null, lCertificateRequest, new Object[] { true });
//lCertificateRequest.Encode();
lCertificateRequestCertificateType.InvokeMember("Encode", BindingFlags.InvokeMethod, null, lCertificateRequest, new Object[] { });
return lCertificateRequest;
}