Ova stranica pokazuje kako koristiti OpenSSL putem P/Invoke u .NET-u.
P/Invoke (Platform Invoke) omogućuje pozivanje nativnih DLL funkcija iz .NET-a:
.NET Kod → P/Invoke → libcrypto-3-x64.dll → OpenSSL
cd MojProjekt copy "D:\Projects\openssl-3.6.0\bin\bin\libcrypto-3-x64.dll" .\ copy "D:\Projects\openssl-3.6.0\bin\bin\libssl-3-x64.dll" .\
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> </PropertyGroup> <ItemGroup> <!-- OpenSSL Native Libraries --> <None Update="libcrypto-3-x64.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="libssl-3-x64.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project>
using System; using System.Runtime.InteropServices; namespace MojProjekt; public static class OpenSslInterop { private const string LIBCRYPTO = "libcrypto-3-x64.dll"; // Inicijalizacija [DllImport(LIBCRYPTO, CallingConvention = CallingConvention.Cdecl)] public static extern int OPENSSL_init_crypto(ulong opts, IntPtr settings); // Dohvati verziju [DllImport(LIBCRYPTO, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr OpenSSL_version(int type); // Konstante public const int OPENSSL_VERSION_STRING = 6; public const ulong OPENSSL_INIT_LOAD_CRYPTO_STRINGS = 0x00000002; public const ulong OPENSSL_INIT_ADD_ALL_CIPHERS = 0x00000004; public const ulong OPENSSL_INIT_ADD_ALL_DIGESTS = 0x00000008; public static void Initialize() { OPENSSL_init_crypto( OPENSSL_INIT_LOAD_CRYPTO_STRINGS | OPENSSL_INIT_ADD_ALL_CIPHERS | OPENSSL_INIT_ADD_ALL_DIGESTS, IntPtr.Zero); } public static string GetVersion() { var ptr = OpenSSL_version(OPENSSL_VERSION_STRING); return Marshal.PtrToStringAnsi(ptr) ?? "Unknown"; } } // Uporaba: class Program { static void Main() { OpenSslInterop.Initialize(); Console.WriteLine($"OpenSSL Verzija: {OpenSslInterop.GetVersion()}"); } }
System.DllNotFoundException: Unable to load DLL 'libcrypto-3-x64.dll'
Rješenje:
CopyToOutputDirectory ispravan?System.EntryPointNotFoundException: Unable to find entry point 'XYZ'
Rješenje:
CallingConvention.Cdecl postavljen?Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional