Q:

extract private key bytes in C#

I am currently able to extract a private key from a PFX file using OpenSSL using the following commands:
openssl pkcs12 -in filename.pfx -nocerts -out privateKey.pem

openssl.exe rsa -in privateKey.pem -out private.pem

The private.pem file begins with ---BEGIN RSA PRIVATE KEY--- and ends with ---END RSA PRIVATE KEY---
I want to do the same in C# using .NET libraries or the Bouncy Castle library. 
How do I do this? 

A:

This is what worked for me.  Should also work for you:
using System;
using System. IO;
using System. Security. Cryptography;
using System. Security. Cryptography. X509Certificates;
using System. Text;
using Org. BouncyCastle. Crypto;
using Org. BouncyCastle. OpenSsl;
using Org. BouncyCastle. Security;

namespace SO6258771
{
    class Program
    {
        static void Main()
        {
            // Load your certificate from file
            X509Certificate2 certificate = new X509Certificate2("filename.pfx", "password", X509KeyStorageFlags. Exportable | X509KeyStorageFlags. PersistKeySet);

            // Now you have your private key in binary form as you wanted
            // You can use rsa. ExportParameters() or rsa. ExportCspBlob() to get you bytes
            // depending on format you need them in
            RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certificate. PrivateKey;

            // Just for lulz, let's write out the PEM representation of the private key
            // using Bouncy Castle, so that we are 100% sure that the result is exaclty the same as:
            // openssl pkcs12 -in filename.pfx -nocerts -out privateKey.pem
            // openssl.exe rsa -in privateKey.pem -out private.pem

            // You should of course dispose of / close the streams properly.  I'm skipping this part for brevity
            MemoryStream memoryStream = new MemoryStream();
            TextWriter streamWriter = new StreamWriter(memoryStream);
            PemWriter pemWriter = new PemWriter(streamWriter);

            AsymmetricCipherKeyPair keyPair = DotNetUtilities. GetRsaKeyPair(rsa);
            pemWriter. WriteObject(keyPair. Private);
            streamWriter. Flush();

            // Here is the output with ---BEGIN RSA PRIVATE KEY---
            // that should be exactly the same as in private.pem
            Console. Write(Encoding. ASCII.GetString(memoryStream. GetBuffer()));
        }
    }
}

A:

I found out that the PEMwriter only works for .NET 2.0 in VS2005.  The .NET 3.5 SDK environment underlines the pemWriter. WriteObject(keyPair. Private); as an error due to a cast issue.  If you try casting this as a PEMObjectGenerator and finally build and debug the code, an InvalidCastException is thrown when the debugger gets to this line of code.  I will make this known in the bouncy castle forum as well.