Ecng.Interop 1.0.306

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Interop --version 1.0.306
                    
NuGet\Install-Package Ecng.Interop -Version 1.0.306
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ecng.Interop" Version="1.0.306" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Interop" Version="1.0.306" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.Interop" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.Interop --version 1.0.306
                    
#r "nuget: Ecng.Interop, 1.0.306"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ecng.Interop@1.0.306
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.Interop&version=1.0.306
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Interop&version=1.0.306
                    
Install as a Cake Tool

Ecng.Interop

A comprehensive .NET library for Platform/Invoke (P/Invoke) operations and native code interoperability. This library provides safe, easy-to-use wrappers for working with unmanaged memory, native libraries, and low-level data structures.

Table of Contents

Overview

Ecng.Interop simplifies the complexity of interoperating with native code by providing:

  • Type-safe wrappers for unmanaged memory operations
  • Automatic memory management with safe handles
  • Helper methods for common marshaling scenarios
  • Optimized fixed-size string types for performance-critical interop scenarios
  • Utilities for loading and calling native libraries dynamically

Key Features

  • Safe Memory Management: RAII-style memory management with HGlobalSafeHandle and SafePointer
  • Dynamic Library Loading: Load and call functions from native DLLs at runtime
  • String Marshaling: Support for ANSI, Unicode, UTF-8, and BSTR string formats
  • Fixed-Size Strings: Pre-defined fixed-size string types (ASCII and UTF-8) for efficient marshaling
  • Pointer Reading/Writing: Sequential pointer reading with PtrReader and type-safe pointer operations
  • Blittable Types: Specialized types like BlittableDecimal for direct memory layout compatibility
  • Time Structures: Compact time representations optimized for interop scenarios
  • Cross-Platform: Works on Windows, Linux, and macOS

Installation

Add a reference to the Ecng.Interop project or include the compiled DLL in your project.

<ProjectReference Include="path\to\Ecng.Interop\Interop.csproj" />

Core Components

Dynamic Library Loading

Using DllLibrary Base Class

The DllLibrary class provides a managed way to load native libraries and access their functions.

using Ecng.Interop;

// Define your library wrapper
public class MyNativeLibrary : DllLibrary
{
    public MyNativeLibrary(string dllPath) : base(dllPath)
    {
        // Retrieve function pointers as delegates
        Add = GetHandler<AddDelegate>("Add");
        Multiply = TryGetHandler<MultiplyDelegate>("Multiply"); // Returns null if not found
    }

    // Define delegate types matching native function signatures
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int AddDelegate(int a, int b);

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int MultiplyDelegate(int a, int b);

    // Public wrapper methods
    public Func<int, int, int> Add { get; }
    public Func<int, int, int> Multiply { get; }
}

// Usage
using (var lib = new MyNativeLibrary(@"C:\path\to\native.dll"))
{
    int result = lib.Add(10, 20); // Returns 30
    Console.WriteLine($"Result: {result}");

    // Check DLL version
    Console.WriteLine($"DLL Version: {lib.DllVersion}");
}
Manual Library Loading
using Ecng.Interop;

// Load library manually
IntPtr libraryHandle = Marshaler.LoadLibrary(@"C:\path\to\library.dll");

try
{
    // Get function pointer
    IntPtr funcPtr = libraryHandle.GetProcAddress("MyFunction");

    // Convert to delegate
    var myFunc = funcPtr.GetDelegateForFunctionPointer<MyFunctionDelegate>();

    // Call the function
    int result = myFunc(42);
}
finally
{
    // Free the library
    libraryHandle.FreeLibrary();
}

Memory Management

HGlobalSafeHandle

HGlobalSafeHandle provides automatic cleanup of unmanaged memory allocated with Marshal.AllocHGlobal.

using Ecng.Interop;

// Allocate 1024 bytes of unmanaged memory
using (var handle = 1024.ToHGlobal())
{
    IntPtr ptr = handle.DangerousGetHandle();

    // Use the memory
    Marshal.WriteInt32(ptr, 42);
    int value = Marshal.ReadInt32(ptr);

    Console.WriteLine($"Value: {value}"); // Output: Value: 42
}
// Memory is automatically freed when disposed

// Allocate and write a string
using (var handle = Encoding.UTF8.ToHGlobal("Hello, World!"))
{
    IntPtr ptr = handle.DangerousGetHandle();
    string decoded = Encoding.UTF8.ToString(ptr);
    Console.WriteLine(decoded); // Output: Hello, World!
}
SafePointer

SafePointer wraps an unmanaged pointer with bounds checking and automatic shifting.

using Ecng.Interop;

// Allocate memory
IntPtr memory = Marshal.AllocHGlobal(100);
try
{
    // Create a SafePointer with size boundary
    var safePtr = new SafePointer(memory, 100);

    // Read a value and auto-shift the pointer
    int value1 = safePtr.Read<int>(autoShift: true);
    int value2 = safePtr.Read<int>(autoShift: true);

    // Read a structure
    MyStruct myStruct = safePtr.ToStruct<MyStruct>(autoShift: true);

    // Copy to byte array
    byte[] buffer = new byte[20];
    safePtr.CopyTo(buffer, autoShift: true);

    // Manual shifting
    safePtr.Shift<long>(); // Shift by sizeof(long)
    safePtr.Shift(16);     // Shift by 16 bytes
}
finally
{
    Marshal.FreeHGlobal(memory);
}
GCHandle<T>

Generic wrapper around GCHandle for pinning managed objects.

using Ecng.Interop;

byte[] data = new byte[] { 1, 2, 3, 4, 5 };

// Pin the array in memory
using (var gcHandle = new GCHandle<byte[]>(data, GCHandleType.Pinned))
{
    // Create a safe pointer to the pinned data
    SafePointer pointer = gcHandle.CreatePointer();

    // Pass pointer to native code
    NativeFunction(pointer.Pointer);
}
// Array is automatically unpinned when disposed

Pointer Utilities

PtrReader

Sequential reading from unmanaged memory pointers.

using Ecng.Interop;

IntPtr dataPtr = GetSomeNativeData();

var reader = new PtrReader(dataPtr);

// Read various types sequentially
byte b = reader.GetByte();
short s = reader.GetShort();
int i = reader.GetInt();
long l = reader.GetLong();
IntPtr p = reader.GetIntPtr();

// Read null-terminated strings
string str1 = reader.GetString();

// Read fixed-length strings
string str2 = reader.GetString(20); // Read 20 characters
Direct Pointer Operations
using Ecng.Interop;

IntPtr ptr = Marshal.AllocHGlobal(100);
try
{
    // Write values
    ptr.Write<int>(42);
    (ptr + 4).Write<short>(100);
    (ptr + 6).Write<byte>(255);

    // Read values
    int intValue = ptr.Read<int>();
    short shortValue = (ptr + 4).Read<short>();
    byte byteValue = (ptr + 6).Read<byte>();

    // Copy to managed array
    byte[] buffer = new byte[10];
    ptr.CopyTo(buffer);
    ptr.CopyTo(buffer, offset: 0, length: 10);

    // Create spans (modern .NET)
    Span<byte> span = ptr.ToSpan(100);
    ReadOnlySpan<byte> roSpan = ptr.ToReadOnlySpan(100);
}
finally
{
    ptr.FreeHGlobal();
}

String Marshaling

The library provides comprehensive string marshaling for different encodings.

using Ecng.Interop;

// ANSI strings
string text = "Hello, World!";
IntPtr ansiPtr = text.FromAnsi();
try
{
    string decoded = ansiPtr.ToAnsi();
    Console.WriteLine(decoded);
}
finally
{
    Marshal.FreeHGlobal(ansiPtr);
}

// Unicode strings
IntPtr unicodePtr = text.FromUnicode();
try
{
    string decoded = unicodePtr.ToUnicode();
    Console.WriteLine(decoded);
}
finally
{
    Marshal.FreeHGlobal(unicodePtr);
}

// Platform-dependent (Auto)
IntPtr autoPtr = text.FromAuto();
try
{
    string decoded = autoPtr.ToAuto();
    Console.WriteLine(decoded);
}
finally
{
    Marshal.FreeHGlobal(autoPtr);
}

// BSTR (COM interop)
IntPtr bstrPtr = text.FromBSTR();
try
{
    string decoded = bstrPtr.ToBSTR();
    Console.WriteLine(decoded);
}
finally
{
    Marshal.FreeBSTR(bstrPtr);
}

// UTF-8 with unsafe pointers
unsafe
{
    byte* utf8Buffer = stackalloc byte[100];
    text.ToUtf8(utf8Buffer, 100);

    string decoded = 100.ToUtf8(utf8Buffer);
    Console.WriteLine(decoded);
}

// ASCII with unsafe pointers
unsafe
{
    byte* asciiBuffer = stackalloc byte[100];
    text.ToAscii(asciiBuffer, 100);

    string decoded = 100.ToAscii(asciiBuffer);
    Console.WriteLine(decoded);
}

Type Marshaling

Structure Marshaling
using Ecng.Interop;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct MyNativeStruct
{
    public int Id;
    public double Value;
    public byte Flag;
}

// Marshal from structure to pointer
MyNativeStruct data = new MyNativeStruct
{
    Id = 1,
    Value = 3.14,
    Flag = 1
};

IntPtr ptr = data.StructToPtr();
try
{
    // Pass ptr to native code
    NativeFunction(ptr);

    // Marshal back from pointer to structure
    MyNativeStruct result = ptr.ToStruct<MyNativeStruct>();
    Console.WriteLine($"ID: {result.Id}, Value: {result.Value}");
}
finally
{
    Marshal.FreeHGlobal(ptr);
}

// Get pointer and size
(IntPtr ptr, int size) = data.StructToPtrEx();
try
{
    Console.WriteLine($"Structure size: {size} bytes");
    // Use ptr and size
}
finally
{
    Marshal.FreeHGlobal(ptr);
}
BlittableDecimal

BlittableDecimal is a struct that matches the memory layout of decimal for direct marshaling.

using Ecng.Interop;

[StructLayout(LayoutKind.Sequential)]
public struct PriceData
{
    public int Quantity;
    public BlittableDecimal Price; // Can be marshaled directly
}

PriceData data = new PriceData
{
    Quantity = 100,
    Price = (BlittableDecimal)123.45m
};

// Marshal to unmanaged memory
IntPtr ptr = data.StructToPtr();
try
{
    // Pass to native code
    NativeFunction(ptr);

    // Read back
    PriceData result = ptr.ToStruct<PriceData>();
    decimal price = result.Price; // Implicit conversion
    Console.WriteLine($"Quantity: {result.Quantity}, Price: {price}");
}
finally
{
    Marshal.FreeHGlobal(ptr);
}

Fixed-Size Strings

Fixed-size string types provide efficient marshaling for scenarios where string length is known at compile time.

UTF-8 Fixed Strings
using Ecng.Interop;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct NetworkPacket
{
    public int PacketId;
    public Utf8String16 Symbol;    // 16 bytes
    public Utf8String32 Message;   // 32 bytes
    public Utf8String8 Source;     // 8 bytes
}

// Usage
NetworkPacket packet = new NetworkPacket
{
    PacketId = 123,
    Symbol = (Utf8String16)"AAPL",
    Message = (Utf8String32)"Order executed",
    Source = (Utf8String8)"NYSE"
};

// Convert to strings
string symbol = packet.Symbol;   // Implicit conversion
string message = packet.Message;
string source = packet.Source.ToString();

Console.WriteLine($"Symbol: {symbol}, Message: {message}");

// Available UTF-8 sizes: 1-33, 48, 64, 65, 128, 129, 256
ASCII Fixed Strings
using Ecng.Interop;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct LegacyRecord
{
    public int RecordId;
    public AsciiString32 Name;     // 32 bytes ASCII
    public AsciiString64 Address;  // 64 bytes ASCII
    public AsciiString16 City;     // 16 bytes ASCII
}

// Usage
LegacyRecord record = new LegacyRecord
{
    RecordId = 1,
    Name = (AsciiString32)"John Doe",
    Address = (AsciiString64)"123 Main Street",
    City = (AsciiString16)"New York"
};

// Convert to strings
string name = record.Name;      // Implicit conversion
string address = record.Address;
string city = record.City.ToString();

Console.WriteLine($"{name} from {city}");

// Available ASCII sizes: 1-32, 64, 128

Time Structures

Compact time representations optimized for native interop.

Time4Sec (4-byte time with second resolution)
using Ecng.Interop;

[StructLayout(LayoutKind.Sequential)]
public struct LogEntry
{
    public Time4Sec Timestamp;  // 4 bytes instead of 8
    public int EventId;
}

// Usage
LogEntry entry = new LogEntry
{
    Timestamp = (Time4Sec)DateTime.UtcNow,
    EventId = 123
};

// Convert to DateTime
DateTime dt = entry.Timestamp;  // Implicit conversion
DateTimeOffset dto = entry.Timestamp;

Console.WriteLine($"Event at: {dt}");
Console.WriteLine($"Formatted: {entry.Timestamp.ToString("yyyy-MM-dd HH:mm:ss", null)}");
Time8Mls (8-byte time with millisecond resolution)
using Ecng.Interop;

[StructLayout(LayoutKind.Sequential)]
public struct TradeData
{
    public Time8Mls ExecutionTime;
    public double Price;
    public int Volume;
}

// Usage
TradeData trade = new TradeData
{
    ExecutionTime = (Time8Mls)DateTime.UtcNow,
    Price = 150.25,
    Volume = 1000
};

DateTime executionTime = trade.ExecutionTime;
Console.WriteLine($"Trade executed at: {executionTime:yyyy-MM-dd HH:mm:ss.fff}");
Time8Mcs (8-byte time with microsecond resolution)
using Ecng.Interop;

[StructLayout(LayoutKind.Sequential)]
public struct HighFrequencyTick
{
    public Time8Mcs Timestamp;
    public double BidPrice;
    public double AskPrice;
}

// Usage
HighFrequencyTick tick = new HighFrequencyTick
{
    Timestamp = (Time8Mcs)DateTime.UtcNow,
    BidPrice = 100.50,
    AskPrice = 100.51
};

DateTime tickTime = tick.Timestamp;
Console.WriteLine($"Tick at: {tickTime:HH:mm:ss.ffffff}");
TimeNano (nanosecond resolution)
using Ecng.Interop;

[StructLayout(LayoutKind.Sequential)]
public struct PrecisionEvent
{
    public TimeNano Timestamp;
    public int EventType;
}

// Usage
PrecisionEvent evt = new PrecisionEvent
{
    Timestamp = (TimeNano)DateTime.UtcNow,
    EventType = 5
};

DateTime eventTime = evt.Timestamp;
Console.WriteLine($"Precise event time: {eventTime:O}");

Hardware Information

Generate hardware-based identifiers for licensing or device identification.

using Ecng.Interop;

// Synchronous
string hardwareId = HardwareInfo.GetId();
Console.WriteLine($"Hardware ID: {hardwareId}");

// Asynchronous
string hardwareIdAsync = await HardwareInfo.GetIdAsync();
Console.WriteLine($"Hardware ID: {hardwareIdAsync}");

// With cancellation
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
try
{
    string id = await HardwareInfo.GetIdAsync(cts.Token);
    Console.WriteLine($"Hardware ID: {id}");
}
catch (OperationCanceledException)
{
    Console.WriteLine("Hardware ID retrieval timed out");
}

The hardware ID is generated based on:

  • Windows: CPU ID + Motherboard Serial Number (or MAC Address)
  • Linux: Root partition UUID
  • macOS: Platform UUID

Usage Examples

Complete Example: Calling Native Library

using Ecng.Interop;
using System.Runtime.InteropServices;

// Define the native structure
[StructLayout(LayoutKind.Sequential)]
public struct Point3D
{
    public double X;
    public double Y;
    public double Z;
}

// Create library wrapper
public class MathLibrary : DllLibrary
{
    public MathLibrary() : base("mathlib.dll")
    {
        CalculateDistance = GetHandler<CalculateDistanceDelegate>("CalculateDistance");
    }

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate double CalculateDistanceDelegate(IntPtr point1, IntPtr point2);

    private CalculateDistanceDelegate CalculateDistance;

    public double GetDistance(Point3D p1, Point3D p2)
    {
        IntPtr ptr1 = p1.StructToPtr();
        IntPtr ptr2 = p2.StructToPtr();
        try
        {
            return CalculateDistance(ptr1, ptr2);
        }
        finally
        {
            ptr1.FreeHGlobal();
            ptr2.FreeHGlobal();
        }
    }
}

// Usage
using (var lib = new MathLibrary())
{
    Point3D p1 = new Point3D { X = 0, Y = 0, Z = 0 };
    Point3D p2 = new Point3D { X = 3, Y = 4, Z = 0 };

    double distance = lib.GetDistance(p1, p2);
    Console.WriteLine($"Distance: {distance}"); // Output: Distance: 5
}

Complete Example: Working with Native Arrays

using Ecng.Interop;
using System.Runtime.InteropServices;

// Allocate array in unmanaged memory
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
int sizeInBytes = sizeof(int) * numbers.Length;

using (var handle = sizeInBytes.ToHGlobal())
{
    IntPtr ptr = handle.DangerousGetHandle();

    // Copy managed array to unmanaged memory
    Marshal.Copy(numbers, 0, ptr, numbers.Length);

    // Create SafePointer for safe iteration
    var safePtr = new SafePointer(ptr, sizeInBytes);

    // Read values
    for (int i = 0; i < numbers.Length; i++)
    {
        int value = safePtr.Read<int>(autoShift: true);
        Console.WriteLine($"Value {i}: {value}");
    }
}

Complete Example: Reading Native Structure with Strings

using Ecng.Interop;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public unsafe struct UserData
{
    public int UserId;
    public AsciiString32 UserName;
    public AsciiString64 Email;
    public Time8Mls RegistrationDate;
}

// Read from native memory
IntPtr nativeDataPtr = GetUserDataFromNativeCode();

UserData user = nativeDataPtr.ToStruct<UserData>();

Console.WriteLine($"User ID: {user.UserId}");
Console.WriteLine($"Name: {(string)user.UserName}");
Console.WriteLine($"Email: {(string)user.Email}");
Console.WriteLine($"Registered: {(DateTime)user.RegistrationDate}");

Best Practices

Memory Management

  1. Always dispose resources: Use using statements for DllLibrary, HGlobalSafeHandle, and GCHandle<T>
  2. Prefer safe wrappers: Use SafePointer over raw IntPtr when possible for bounds checking
  3. Match allocation/deallocation: Use FreeHGlobal() for memory allocated with AllocHGlobal()
// Good
using (var handle = 1024.ToHGlobal())
{
    // Use memory
} // Automatically freed

// Avoid
IntPtr ptr = Marshal.AllocHGlobal(1024);
// ... might forget to free

String Marshaling

  1. Choose the right encoding: Use UTF-8 for modern APIs, ASCII for legacy systems
  2. Use fixed-size strings for structures: More efficient than string marshaling
  3. Be aware of null terminators: ANSI/Unicode strings are null-terminated
// Good for structures
[StructLayout(LayoutKind.Sequential)]
public struct Config
{
    public Utf8String32 Name;  // Fixed size, no allocation
}

// Avoid for structures (requires marshaling)
[StructLayout(LayoutKind.Sequential)]
public struct ConfigBad
{
    [MarshalAs(UnmanagedType.LPStr)]
    public string Name;  // Requires allocation and marshaling
}

Platform Considerations

  1. Check platform: Use OperatingSystem checks when necessary
  2. Handle pointer size: Use IntPtr.Size for platform-dependent sizes
  3. Test on target platforms: Marshaling behavior can differ between platforms
if (OperatingSystem.IsWindows())
{
    // Windows-specific code
}
else if (OperatingSystem.IsLinux())
{
    // Linux-specific code
}

Performance

  1. Pin arrays for bulk operations: Use GCHandle<T> to avoid copying
  2. Use stackalloc for small buffers: Avoid heap allocation when possible
  3. Batch operations: Minimize transitions between managed and unmanaged code
// Good: Single pinning for bulk operation
byte[] data = new byte[1000];
using (var handle = new GCHandle<byte[]>(data, GCHandleType.Pinned))
{
    SafePointer ptr = handle.CreatePointer();
    NativeBulkOperation(ptr.Pointer, data.Length);
}

// Avoid: Multiple small transitions
for (int i = 0; i < 1000; i++)
{
    NativeSingleOperation(data[i]); // Many transitions
}

Platform Support

  • .NET Standard 2.0: Compatible with .NET Framework 4.6.1+ and .NET Core 2.0+
  • .NET 6.0: Full support
  • .NET 10.0: Full support with latest features
  • Operating Systems: Windows, Linux, macOS

Dependencies

  • Ecng.Common: Core utilities
  • WmiLight: Windows Management Instrumentation for hardware info
  • Microsoft.Windows.CsWin32: Windows API source generator

Thread Safety

  • Most classes are not thread-safe by default
  • DllLibrary instances should not be shared between threads without synchronization
  • Memory allocation/deallocation is thread-safe (handled by the runtime)

License

This library is part of the StockSharp/Ecng project.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (6)

Showing the top 5 NuGet packages that depend on Ecng.Interop:

Package Downloads
StockSharp.Algo

Trading algorithms. More info on web site https://stocksharp.com/store/

StockSharp.Licensing

Licensing components. More info on web site https://stocksharp.com/store/

Ecng.Interop.Windows

Ecng system framework

Ecng.ManagedWinapi

Ecng system framework

StockSharp.RtsHistory

Trading and algorithmic trading platform (stock markets, forex, bitcoins and options). .NET API for InteractiveBrokers, GainCapital, OANDA, FIX/FAST, Binance etc. More info on web site https://stocksharp.com/store/api/

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Ecng.Interop:

Repository Stars
StockSharp/StockSharp
Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).
Version Downloads Last Updated
1.0.317 116 2/4/2026
1.0.316 252 2/1/2026
1.0.315 165 1/26/2026
1.0.314 89 1/26/2026
1.0.313 114 1/22/2026
1.0.312 99 1/22/2026
1.0.311 183 1/19/2026
1.0.310 96 1/18/2026
1.0.309 90 1/18/2026
1.0.308 98 1/16/2026
1.0.307 155 1/14/2026
1.0.306 96 1/13/2026
1.0.305 96 1/13/2026
1.0.304 195 1/9/2026
1.0.303 113 1/9/2026
1.0.302 207 1/8/2026
1.0.301 614 1/4/2026
1.0.300 956 1/1/2026
1.0.299 1,164 12/31/2025
1.0.298 1,265 12/30/2025
1.0.297 1,255 12/30/2025
1.0.296 1,476 12/29/2025
1.0.295 2,068 12/26/2025
1.0.294 2,063 12/26/2025
1.0.293 2,066 12/26/2025
1.0.292 2,086 12/26/2025
1.0.291 2,404 12/25/2025
1.0.290 2,447 12/25/2025
1.0.289 2,985 12/22/2025
1.0.288 3,157 12/21/2025
1.0.287 3,707 12/19/2025
1.0.286 3,765 12/19/2025
1.0.285 4,394 12/17/2025
1.0.284 4,839 12/15/2025
1.0.283 5,419 12/12/2025
1.0.282 5,483 12/12/2025
1.0.281 8,326 11/29/2025
1.0.280 8,182 11/28/2025
1.0.279 8,184 11/28/2025
1.0.278 8,236 11/27/2025
1.0.277 8,335 11/24/2025
1.0.276 8,250 11/24/2025
1.0.275 8,244 11/23/2025
1.0.274 8,303 11/22/2025
1.0.273 8,548 11/20/2025
1.0.272 8,499 11/18/2025
1.0.271 8,450 11/18/2025
1.0.270 8,437 11/13/2025
1.0.269 8,329 11/13/2025
1.0.268 8,324 11/10/2025
1.0.267 9,207 11/1/2025
1.0.266 8,302 10/28/2025
1.0.265 8,306 10/27/2025
1.0.264 8,258 10/27/2025
1.0.263 8,172 10/25/2025
1.0.262 9,255 10/3/2025
1.0.261 8,487 9/25/2025
1.0.260 13,457 8/30/2025
1.0.259 8,504 8/14/2025
1.0.258 11,340 7/14/2025
1.0.257 8,310 7/13/2025
1.0.256 8,254 7/13/2025
1.0.255 8,224 7/12/2025
1.0.254 8,748 7/8/2025
1.0.253 10,721 6/16/2025
1.0.252 8,434 6/9/2025
1.0.251 8,340 6/8/2025
1.0.250 8,897 5/21/2025
1.0.249 8,260 5/17/2025
1.0.248 8,936 5/12/2025
1.0.247 8,327 5/12/2025
1.0.246 8,322 5/12/2025
1.0.245 8,264 5/11/2025
1.0.244 8,263 5/11/2025
1.0.243 8,247 5/11/2025
1.0.242 8,251 5/11/2025
1.0.241 8,279 5/6/2025
1.0.240 8,275 5/2/2025
1.0.239 8,388 4/17/2025
1.0.238 8,327 4/12/2025
1.0.237 9,979 3/20/2025
1.0.236 8,295 3/19/2025
1.0.235 9,679 2/26/2025
1.0.234 8,249 2/26/2025
1.0.233 9,758 2/5/2025
1.0.232 8,340 1/21/2025
1.0.231 8,266 1/14/2025
1.0.230 8,250 1/12/2025
1.0.229 8,236 1/10/2025
1.0.228 11,019 11/18/2024
1.0.227 8,807 11/7/2024
1.0.226 8,412 10/19/2024
1.0.225 10,262 10/5/2024
1.0.224 9,872 9/18/2024
1.0.223 8,276 9/17/2024
1.0.222 9,507 9/4/2024
1.0.221 8,249 9/3/2024
1.0.220 8,257 9/1/2024
1.0.219 9,260 8/23/2024
1.0.218 8,292 8/22/2024
1.0.217 12,653 6/12/2024
1.0.216 9,041 5/28/2024
1.0.215 10,242 5/4/2024
1.0.214 9,460 4/14/2024
1.0.213 9,754 3/28/2024
1.0.212 8,319 3/17/2024
1.0.211 9,736 2/23/2024
1.0.210 8,280 2/23/2024
1.0.209 9,787 2/18/2024
1.0.208 8,272 2/16/2024
1.0.207 8,251 2/16/2024
1.0.206 9,135 2/13/2024
1.0.205 9,050 2/8/2024
1.0.204 9,286 2/4/2024
1.0.203 9,389 1/23/2024
1.0.202 8,983 1/12/2024
1.0.201 9,665 1/2/2024
1.0.200 8,285 12/29/2023
1.0.199 27,141 12/10/2023
1.0.198 29,485 11/12/2023
1.0.197 25,808 11/10/2023
1.0.196 25,783 11/10/2023
1.0.195 25,804 11/9/2023
1.0.194 25,829 11/3/2023
1.0.193 25,793 11/1/2023
1.0.192 25,791 11/1/2023
1.0.191 30,785 9/8/2023
1.0.190 25,838 9/8/2023
1.0.189 8,296 9/8/2023
1.0.188 8,340 9/6/2023
1.0.187 25,876 9/3/2023
1.0.186 25,944 8/21/2023
1.0.185 8,384 8/14/2023
1.0.184 25,910 8/10/2023
1.0.183 30,847 6/29/2023
1.0.182 28,171 5/27/2023
1.0.181 25,932 5/19/2023
1.0.180 27,750 5/14/2023
1.0.179 27,307 5/8/2023
1.0.178 8,476 4/21/2023
1.0.177 32,339 4/3/2023
1.0.176 26,170 3/13/2023
1.0.175 28,533 3/6/2023
1.0.174 8,503 2/26/2023
1.0.173 33,445 2/9/2023
1.0.172 28,741 2/7/2023
1.0.171 26,058 2/4/2023
1.0.170 29,008 2/2/2023
1.0.169 29,037 1/30/2023
1.0.168 8,614 1/18/2023
1.0.167 33,673 12/30/2022
1.0.166 8,563 12/23/2022
1.0.165 8,548 12/14/2022
1.0.164 8,524 12/14/2022
1.0.163 8,507 12/14/2022
1.0.162 8,543 12/14/2022
1.0.161 8,524 12/14/2022
1.0.160 30,216 12/12/2022
1.0.159 29,979 12/8/2022
1.0.158 8,597 12/4/2022
1.0.157 8,542 12/4/2022
1.0.156 26,141 11/30/2022
1.0.155 26,111 11/29/2022
1.0.154 26,115 11/28/2022
1.0.153 26,144 11/18/2022
1.0.152 30,820 11/11/2022
1.0.151 26,110 11/11/2022
1.0.150 8,595 11/10/2022
1.0.149 26,172 11/5/2022
1.0.148 26,133 11/4/2022
1.0.147 44,452 11/1/2022
1.0.146 46,846 10/16/2022
1.0.145 26,303 9/25/2022
1.0.144 8,749 9/10/2022
1.0.143 8,682 9/10/2022
1.0.142 68,009 9/8/2022
1.0.141 26,261 9/8/2022
1.0.140 8,680 9/8/2022
1.0.139 26,265 9/4/2022
1.0.138 26,233 9/4/2022
1.0.137 91,860 8/24/2022
1.0.136 26,323 8/8/2022
1.0.135 26,230 8/8/2022
1.0.134 26,294 7/26/2022
1.0.133 26,238 7/26/2022
1.0.132 68,964 7/19/2022
1.0.131 50,403 7/18/2022
1.0.130 26,301 7/13/2022
1.0.129 26,279 7/8/2022
1.0.128 26,307 6/30/2022
1.0.127 26,320 6/18/2022
1.0.126 26,297 6/6/2022
1.0.125 110,206 4/30/2022
1.0.124 26,310 4/20/2022
1.0.123 26,325 4/10/2022
1.0.122 26,271 4/7/2022
1.0.121 26,290 4/7/2022
1.0.120 26,349 4/2/2022
1.0.119 33,259 3/29/2022
1.0.118 26,260 3/27/2022
1.0.117 8,738 3/27/2022
1.0.116 111,263 2/20/2022
1.0.115 26,274 2/20/2022
1.0.114 26,289 2/20/2022
1.0.113 26,291 2/20/2022
1.0.112 26,307 2/20/2022
1.0.111 26,277 2/20/2022
1.0.110 26,298 2/20/2022
1.0.109 26,306 2/20/2022
1.0.108 26,262 2/20/2022
1.0.107 26,260 2/19/2022
1.0.106 147,566 1/24/2022
1.0.105 170,187 12/29/2021
1.0.104 51,309 12/20/2021
1.0.103 26,212 12/13/2021
1.0.102 51,476 12/7/2021
1.0.101 26,125 12/7/2021
1.0.100 51,575 12/6/2021
1.0.99 26,130 12/6/2021
1.0.98 26,124 12/5/2021
1.0.97 8,591 12/2/2021
1.0.96 52,984 11/29/2021
1.0.95 51,156 11/22/2021
1.0.94 26,244 11/17/2021
1.0.93 26,206 11/14/2021
1.0.92 52,185 11/13/2021
1.0.91 26,247 11/11/2021
1.0.90 26,170 11/11/2021
1.0.89 26,204 11/10/2021
1.0.88 26,211 11/9/2021
1.0.87 81,319 11/5/2021
1.0.86 26,220 11/5/2021
1.0.85 26,182 11/4/2021
1.0.84 26,185 11/4/2021
1.0.83 26,191 11/3/2021
1.0.82 26,277 10/30/2021
1.0.81 54,729 10/21/2021
1.0.80 26,291 10/17/2021
1.0.79 80,780 10/14/2021
1.0.78 30,442 10/13/2021
1.0.77 26,215 10/12/2021
1.0.76 54,643 10/11/2021
1.0.75 26,170 10/9/2021
1.0.74 40,409 10/7/2021
1.0.73 56,758 10/7/2021
1.0.72 26,168 10/7/2021
1.0.71 8,678 10/6/2021
1.0.70 26,256 9/28/2021
1.0.69 55,604 9/23/2021
1.0.68 26,286 9/11/2021
1.0.67 26,217 9/10/2021
1.0.66 26,213 9/9/2021
1.0.65 26,166 9/8/2021
1.0.64 26,214 9/8/2021
1.0.63 54,116 9/6/2021
1.0.62 8,672 8/31/2021
1.0.61 8,626 8/30/2021
1.0.60 55,064 7/31/2021
1.0.59 79,795 7/30/2021
1.0.58 26,247 7/26/2021
1.0.57 106,476 7/5/2021
1.0.56 26,254 7/1/2021
1.0.55 82,341 6/4/2021
1.0.54 107,572 4/26/2021
1.0.53 54,085 4/19/2021
1.0.52 159,858 4/7/2021
1.0.51 53,357 4/3/2021
1.0.50 169,302 3/22/2021
1.0.49 126,471 3/4/2021
1.0.48 53,406 2/26/2021
1.0.47 175,255 2/2/2021
1.0.46 59,180 1/26/2021
1.0.45 76,139 1/24/2021
1.0.44 8,696 1/24/2021
1.0.43 8,750 1/23/2021
1.0.42 59,002 1/20/2021
1.0.41 26,261 1/20/2021
1.0.40 51,428 1/18/2021
1.0.39 8,663 1/18/2021
1.0.38 50,537 1/16/2021
1.0.37 131,452 12/16/2020
1.0.36 78,228 12/14/2020
1.0.35 55,748 12/9/2020
1.0.34 26,632 12/7/2020
1.0.33 26,758 12/6/2020
1.0.32 26,669 12/2/2020
1.0.31 26,640 12/2/2020
1.0.30 52,301 12/1/2020
1.0.29 167,859 11/12/2020
1.0.29-atestpub 742 11/11/2020
1.0.28 52,248 10/11/2020
1.0.27 106,048 9/9/2020
1.0.26 51,016 9/3/2020
1.0.25 51,551 8/20/2020
1.0.24 99,935 8/9/2020
1.0.23 33,393 7/28/2020
1.0.22 50,839 7/19/2020
1.0.21 73,952 7/6/2020
1.0.20 100,201 6/6/2020
1.0.19 34,406 6/4/2020
1.0.18 58,188 5/29/2020
1.0.17 75,634 5/21/2020
1.0.16 9,318 5/17/2020
1.0.15 78,824 5/12/2020
1.0.14 130,970 5/4/2020
1.0.13 30,078 4/24/2020
1.0.12 12,996 4/22/2020
1.0.11 26,982 4/22/2020
1.0.10 27,009 4/21/2020
1.0.9 55,015 4/18/2020
1.0.8 35,418 4/16/2020
1.0.7 9,523 4/16/2020
1.0.6 49,182 4/15/2020
1.0.5 51,074 4/11/2020
1.0.4 50,498 4/3/2020
1.0.3 9,510 4/1/2020
1.0.2 37,648 3/27/2020
1.0.1 36,592 3/22/2020
1.0.0 11,408 3/22/2020