我正在尝试创建一个.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指令导入从DLL创建的TLB文件,但唯一可用的函数是_AESEncryption和LIB_AES等
我没有看到界面或功能加密。
当我尝试实例化所以我可以调用VC ++程序中的函数时,我使用此代码并得到以下错误:
HRESULT hr = CoInitialize(NULL);
IEncryptPtr pIEncrypt(__uuidof(EncryptDecryptInt));
错误C2065:'IEncryptPtr':未声明的标识符
错误C2146:语法错误:缺少';'在标识符“pIEncrypt”之前
答案 0 :(得分:3)
如果没有额外的工作,C#.Net库需要主机应用程序使用.net运行时环境。
实际上,这篇文章描述了如何从非托管代码中调用.net dll:
答案 1 :(得分: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.
}
}
}
答案 2 :(得分:2)
查看this问题。 最简单的选择是使用托管C ++创建混合模式DLL。
如果您需要加密库,为什么不使用OpenSSL? 与依赖.NET相比,它将为您提供更好的性能和更少的依赖性。