2010-04-07 4 views
1

Я пытаюсь создать .NET DLL, поэтому я могу использовать криптографические функции с моим не .NET-приложением.Попытка создать .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 и т. д.

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

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

HRESULT hr = CoInitialize(NULL); 

IEncryptPtr pIEncrypt(__uuidof(EncryptDecryptInt)); 

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

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

ответ

3

Вы, кажется, не пометили интерфейса, как видно через 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

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

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

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

+0

Но не Microsoft ли это обратно совместимо, следовательно COM совместимость? – 2010-04-07 13:16:22

+0

Ты прав, забыл об этом. Вот статья, в которой показано, как это сделать. – kemiller2002

2

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

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

+0

Или просто CryptoAPI может быть достаточно. –