Попытка создать .NET DLL для использования с приложением, отличным от .NET - PullRequest
1 голос
/ 07 апреля 2010

Я пытаюсь создать .NET DLL, чтобы я мог использовать криптографические функции с моим приложением, отличным от .NET.

Я создал библиотеку классов с таким кодом:

namespace AESEncryption
{
    public class EncryptDecrypt
    {
        private static readonly byte[] optionalEntropy = { 0x21, 0x05, 0x07, 0x08, 0x27, 0x02, 0x23, 0x36, 0x45, 0x50 };

        public interface IEncrypt
        {
            string Encrypt(string data, string filePath);
        };

        public class EncryptDecryptInt:IEncrypt
        {

            public string Encrypt(string data, string filePath)
            {
                byte[] plainKey;

                try
                {
                    // Read in the secret key from our cipher key store
                    byte[] cipher = File.ReadAllBytes(filePath);
                    plainKey = ProtectedData.Unprotect(cipher, optionalEntropy, DataProtectionScope.CurrentUser);

                    // Convert our plaintext data into a byte array

                    byte[] plainTextBytes = Encoding.ASCII.GetBytes(data);

                    MemoryStream ms = new MemoryStream();

                    Rijndael alg = Rijndael.Create();

                    alg.Mode = CipherMode.CBC;
                    alg.Key = plainKey;
                    alg.IV = optionalEntropy;

                    CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);

                    cs.Write(plainTextBytes, 0, plainTextBytes.Length);

                    cs.Close();

                    byte[] encryptedData = ms.ToArray();

                    return Convert.ToString(encryptedData);
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
        }
    }
}

В моем приложении VC ++ я использую директиву #import для импорта файла TLB, созданного из DLL, но единственными доступными функциями являются _AESEncryption и LIB_AES и т. Д.

Я не вижу интерфейс или функцию Encrypt.

Когда я пытаюсь создать экземпляр, чтобы я мог вызвать функции в моей программе VC ++, я использую этот код и получаю следующую ошибку:

HRESULT hr = CoInitialize(NULL);

IEncryptPtr pIEncrypt(__uuidof(EncryptDecryptInt));

ошибка C2065: 'IEncryptPtr': необъявленный идентификатор

ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'pIEncrypt'

Ответы [ 3 ]

3 голосов
/ 07 апреля 2010

Вы не пометили интерфейс как видимый через COM. Я ожидаю увидеть что-то вроде:

namespace AESEncryption
{
    [Guid("[a new guid for the interface]")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IEncrypt        {
        string Encrypt(string data, string filePath);
    }

    [Guid("[a new guid for the class]")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class EncryptDecryptInt : IEncrypt
    {
        public string Encrypt(string data, string filePath)
        {
            // etc.
        }
    }
}
3 голосов
/ 07 апреля 2010

Без дополнительной работы библиотекам C # .Net требуется, чтобы хост-приложение использовало среду выполнения .net.

Собственно, вот статья, описывающая, как вызывать dll .net из неуправляемого кода:

http://support.microsoft.com/kb/828736

2 голосов
/ 07 апреля 2010

Посмотрите на этот вопрос. Самый простой вариант - использовать Managed C ++ для создания DLL в смешанном режиме.

Если вам нужна библиотека шифрования, почему бы не использовать OpenSSL? Это даст вам лучшую производительность и меньше зависимостей, чем использование .NET.

...