Major improvements: MinIO 4.0.7 compatibility, file handle fixes, clean logging, session management

Key Achievements:
- Downgraded to MinIO 4.0.7 for PowerShell compatibility (eliminated async/await issues)
- Fixed file handle leaks in upload operations (using explicit FileStream management)
- Implemented clean logging (timestamps without redundant prefixes)
- Fixed automatic session variable management (Connect-MinIO stores, cmdlets retrieve)
- Removed duplicate certificate parameters (kept only SkipCertificateValidation)
- Fixed all 'Folder' alias conflicts across cmdlets
- Added correct System.Runtime.CompilerServices.Unsafe.dll version (4.5.3)

 Working Features:
- Connection management (automatic + explicit override)
- Bucket operations (list, create, remove)
- File upload/download (with proper handle release)
- Progress tracking and speed reporting
- Clean verbose logging with timestamps

 Known Issue:
- Chunked operations have threading violations (PowerShell cmdlet methods called from background threads)
- Regular operations work perfectly, chunked operations need threading architecture fix

 Test Results:
- 3.71GB Windows install.wim file tested
- Regular upload/download:  Working
- File handles:  No leaks, immediate deletion possible
- Session management:  Automatic connection storage/retrieval
- Chunked operations:  Threading violations need fix
This commit is contained in:
PSMinIO Developer
2025-07-10 20:55:14 -04:00
parent 51cd2d4133
commit 2974ead76e
63 changed files with 3463 additions and 29 deletions
@@ -0,0 +1,353 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>NetFx.System.Runtime.CompilerServices.Unsafe</name>
</assembly>
<members>
<member name="T:System.Runtime.CompilerServices.Unsafe">
<summary>
Contains generic, low-level functionality for manipulating pointers.
</summary>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Read``1(System.Void*)">
<summary>
Reads a value of type <typeparamref name="T"/> from the given location.
</summary>
<typeparam name="T">The type to read.</typeparam>
<param name="source">The location to read from.</param>
<returns>An object of type <typeparamref name="T"/> read from the given location.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.ReadUnaligned``1(System.Void*)">
<summary>
Reads a value of type <typeparamref name="T"/> from the given location.
</summary>
<typeparam name="T">The type to read.</typeparam>
<param name="source">The location to read from.</param>
<returns>An object of type <typeparamref name="T"/> read from the given location.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.ReadUnaligned``1(System.Byte@)">
<summary>
Reads a value of type <typeparamref name="T"/> from the given location.
</summary>
<typeparam name="T">The type to read.</typeparam>
<param name="source">The location to read from.</param>
<returns>An object of type <typeparamref name="T"/> read from the given location.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Write``1(System.Void*,``0)">
<summary>
Writes a value of type <typeparamref name="T"/> to the given location.
</summary>
<typeparam name="T">The type of value to write.</typeparam>
<param name="destination">The location to write to.</param>
<param name="value">The value to write.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.WriteUnaligned``1(System.Void*,``0)">
<summary>
Writes a value of type <typeparamref name="T"/> to the given location.
</summary>
<typeparam name="T">The type of value to write.</typeparam>
<param name="destination">The location to write to.</param>
<param name="value">The value to write.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.WriteUnaligned``1(System.Byte@,``0)">
<summary>
Writes a value of type <typeparamref name="T"/> to the given location.
</summary>
<typeparam name="T">The type of value to write.</typeparam>
<param name="destination">The location to write to.</param>
<param name="value">The value to write.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Copy``1(System.Void*,``0@)">
<summary>
Copies a value of type <typeparamref name="T"/> to the given location.
</summary>
<typeparam name="T">The type of value to copy.</typeparam>
<param name="destination">The location to copy to.</param>
<param name="source">A reference to the value to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Copy``1(``0@,System.Void*)">
<summary>
Copies a value of type <typeparamref name="T"/> to the given location.
</summary>
<typeparam name="T">The type of value to copy.</typeparam>
<param name="destination">The location to copy to.</param>
<param name="source">A pointer to the value to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AsPointer``1(``0@)">
<summary>
Returns a pointer to the given by-ref parameter.
</summary>
<typeparam name="T">The type of object.</typeparam>
<param name="value">The object whose pointer is obtained.</param>
<returns>A pointer to the given value.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.SizeOf``1">
<summary>
Returns the size of an object of the given type parameter.
</summary>
<typeparam name="T">The type of object whose size is retrieved.</typeparam>
<returns>The size of an object of type <typeparamref name="T"/>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.As``1(System.Object)">
<summary>
Casts the given object to the specified type, performs no dynamic type checking.
</summary>
<typeparam name="T">The type which the object will be cast to.</typeparam>
<param name="o">The object to cast.</param>
<returns>The original object, casted to the given type.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AsRef``1(System.Void*)">
<summary>
Reinterprets the given location as a reference to a value of type <typeparamref name="T"/>.
</summary>
<typeparam name="T">The type of the interpreted location.</typeparam>
<param name="source">The location of the value to reference.</param>
<returns>A reference to a value of type <typeparamref name="T"/>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AsRef``1(``0@)">
<summary>
Reinterprets the given read-only reference as a reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The read-only reference to reinterpret.</param>
<returns>A reference to a value of type <typeparamref name="T"/>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.As``2(``0@)">
<summary>
Reinterprets the given reference as a reference to a value of type <typeparamref name="TTo"/>.
</summary>
<typeparam name="TFrom">The type of reference to reinterpret.</typeparam>
<typeparam name="TTo">The desired type of the reference.</typeparam>
<param name="source">The reference to reinterpret.</param>
<returns>A reference to a value of type <typeparamref name="TTo"/>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Unbox``1(System.Object)">
<summary>
Returns a reference to the value type contained with the specified box object.
</summary>
<typeparam name="T">The type of the value type contained within the box.</typeparam>
<param name="box">The boxed value type.</param>
<returns>A reference to a value of type <typeparamref name="T"/> in the box object.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.Int32)">
<summary>
Adds an element offset to the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to add the offset to.</param>
<param name="elementOffset">The offset to add.</param>
<returns>A new reference that reflects the addition of offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(System.Void*,System.Int32)">
<summary>
Adds an element offset to the given pointer.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The pointer to add the offset to.</param>
<param name="elementOffset">The offset to add.</param>
<returns>A new pointer that reflects the addition of offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.IntPtr)">
<summary>
Adds an element offset to the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to add the offset to.</param>
<param name="elementOffset">The offset to add.</param>
<returns>A new reference that reflects the addition of offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.UIntPtr)">
<summary>
Adds an element offset to the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to add the offset to.</param>
<param name="elementOffset">The offset to add.</param>
<returns>A new reference that reflects the addition of offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AddByteOffset``1(``0@,System.IntPtr)">
<summary>
Adds a byte offset to the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to add the offset to.</param>
<param name="byteOffset">The offset to add.</param>
<returns>A new reference that reflects the addition of byte offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AddByteOffset``1(``0@,System.UIntPtr)">
<summary>
Adds a byte offset to the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to add the offset to.</param>
<param name="byteOffset">The offset to add.</param>
<returns>A new reference that reflects the addition of byte offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.Int32)">
<summary>
Subtracts an element offset from the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to subtract the offset from.</param>
<param name="elementOffset">The offset to subtract.</param>
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.IntPtr)">
<summary>
Subtracts an element offset from the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to subtract the offset from.</param>
<param name="elementOffset">The offset to subtract.</param>
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.UIntPtr)">
<summary>
Subtracts an element offset from the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to subtract the offset from.</param>
<param name="elementOffset">The offset to subtract.</param>
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.SubtractByteOffset``1(``0@,System.IntPtr)">
<summary>
Subtracts a byte offset from the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to subtract the offset from.</param>
<param name="byteOffset">The offset to subtract.</param>
<returns>A new reference that reflects the subraction of byte offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.SubtractByteOffset``1(``0@,System.UIntPtr)">
<summary>
Subtracts a byte offset from the given reference.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="source">The reference to subtract the offset from.</param>
<param name="byteOffset">The offset to subtract.</param>
<returns>A new reference that reflects the subraction of byte offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.ByteOffset``1(``0@,``0@)">
<summary>
Determines the byte offset from origin to target from the given references.
</summary>
<typeparam name="T">The type of reference.</typeparam>
<param name="origin">The reference to origin.</param>
<param name="target">The reference to target.</param>
<returns>Byte offset from origin to target i.e. <paramref name="target"/> - <paramref name="origin"/>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AreSame``1(``0@,``0@)">
<summary>
Determines whether the specified references point to the same location.
</summary>
<param name="left">The first reference to compare.</param>
<param name="right">The second reference to compare.</param>
<returns><c>true</c> if <paramref name="left"/> and <paramref name="right"/> point to the same location; otherwise <c>false</c>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.IsAddressGreaterThan``1(``0@,``0@)">
<summary>
Determines whether the memory address referenced by <paramref name="left"/> is greater than the memory address referenced by <paramref name="right"/>.
</summary>
<param name="left">The first reference to compare.</param>
<param name="right">The second reference to compare.</param>
<returns><c>true</c> if the memory address referenced by <paramref name="left"/> is greater than the memory address referenced by <paramref name="right"/>; otherwise <c>false</c>.</returns>
<remarks>
This check is conceptually similar to "(void*)(&amp;left) &gt; (void*)(&amp;right)". Both parameters must reference the same object, array, or span;
or the objects being referenced must both be pinned; or both references must represent unmanaged pointers; otherwise the result is undefined.
</remarks>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.IsAddressLessThan``1(``0@,``0@)">
<summary>
Determines whether the memory address referenced by <paramref name="left"/> is less than the memory address referenced by <paramref name="right"/>.
</summary>
<param name="left">The first reference to compare.</param>
<param name="right">The second reference to compare.</param>
<returns><c>true</c> if the memory address referenced by <paramref name="left"/> is less than the memory address referenced by <paramref name="right"/>; otherwise <c>false</c>.</returns>
<remarks>
This check is conceptually similar to "(void*)(&amp;left) &lt; (void*)(&amp;right)". Both parameters must reference the same object, array, or span;
or the objects being referenced must both be pinned; or both references must represent unmanaged pointers; otherwise the result is undefined.
</remarks>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.IsNullRef``1(``0@)">
<summary>
Returns if a given reference to a value of type <typeparamref name="T"/> is a null reference.
</summary>
<param name="source">The reference to check.</param>
<remarks>This check is conceptually similar to "(void*)(&amp;source) == nullptr".</remarks>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.NullRef``1">
<summary>
Returns a reference to a value of type <typeparamref name="T"/> that is a null reference.
</summary>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlock(System.Void*,System.Void*,System.UInt32)">
<summary>
Copies bytes from the source address to the destination address.
</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlock(System.Byte@,System.Byte@,System.UInt32)">
<summary>
Copies bytes from the source address to the destination address.
</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(System.Void*,System.Void*,System.UInt32)">
<summary>
Copies bytes from the source address to the destination address
without assuming architecture dependent alignment of the addresses.
</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(System.Byte@,System.Byte@,System.UInt32)">
<summary>
Copies bytes from the source address to the destination address
without assuming architecture dependent alignment of the addresses.
</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlock(System.Void*,System.Byte,System.UInt32)">
<summary>
Initializes a block of memory at the given location with a given initial value.
</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlock(System.Byte@,System.Byte,System.UInt32)">
<summary>
Initializes a block of memory at the given location with a given initial value.
</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(System.Void*,System.Byte,System.UInt32)">
<summary>
Initializes a block of memory at the given location with a given initial value
without assuming architecture dependent alignment of the address.
</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(System.Byte@,System.Byte,System.UInt32)">
<summary>
Initializes a block of memory at the given location with a given initial value
without assuming architecture dependent alignment of the address.
</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
</members>
</doc>
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,48 @@
System.Runtime.CompilerServices.Unsafe Polyfill for .NET Framework 4.0
========
[![Nuget](https://img.shields.io/nuget/dt/NetFx.System.Runtime.CompilerServices.Unsafe)](https://www.nuget.org/packages/NetFx.System.Runtime.CompilerServices.Unsafe)
[![Azure DevOps builds (main)](https://img.shields.io/azure-devops/build/NightOwl888/NetFx.Polyfills/4/main)](https://dev.azure.com/NightOwl888/NetFx.Polyfills/_build?definitionId=4&_a=summary)
[![GitHub](https://img.shields.io/github/license/NightOwl888/NetFx.Polyfills)](https://github.com/NightOwl888/NetFx.Polyfills/blob/main/LICENSE)
[![GitHub Sponsors](https://img.shields.io/badge/-Sponsor-fafbfc?logo=GitHub%20Sponsors)](https://github.com/sponsors/NightOwl888)
Provides the System.Runtime.CompilerServices.Unsafe class, which provides generic, low-level functionality for manipulating pointers.
Commonly Used Types:
- System.Runtime.CompilerServices.Unsafe
------------
This package adds support for System.Runtime.CompilerServices.Unsafe on .NET Framework 4.0.
This is a compilation using the System.Runtime.CompilerServices.Unsafe source code from .NET Core 6.0.28. All tests are passing.
This is not meant to be an upgrade to System.Runtime.CompilerServices.Unsafe 6.0.0, it is simply to add support on the `net40` target for all of the existing APIs in System.Runtime.CompilerServices.Unsafe 6.0.0. It is recommended to use the official release of System.Runtime.CompilerServices.Unsafe on newer versions of .NET.
## Interop with System.Runtime.CompilerServices.Unsafe on Targets > net40
Since the runtime for `net40` hasn't been supported for many years, most likely you will be using a newer runtime with this library. But you may be interoperating with other components that target System.Runtime.CompilerServices.Unsafe, which will cause type collisions by default.
In this case, it is recommended to remove System.Runtime.CompilerServices.Unsafe from compilation and add NetFx.System.Runtime.CompilerServices.Unsafe in its place. Add the following to your `.csproj` or `.vbproj` file. This example is for using `net452`.
```xml
<ItemGroup Condition=" '$(TargetFramework)' == 'net452' ">
<!-- ExcludeAssets=compile removes the dependency from being referenced.
ExcludeAssets=runtime removes the dependency from the build output. -->
<PackageReference Include="System.Runtime.CompilerServices.Unsafe"
Version="6.0.0"
ExcludeAssets="compile;runtime" />
<PackageReference Include="NetFx.System.Runtime.CompilerServices.Unsafe"
Version="4.0.0" />
</ItemGroup>
```
> **NOTE:** Only SDK-style projects are supported using this method.
For transitive dependencies (that is, dependencies that are not directly referenced) that have a `net40` target, consider [forcing a specific target framework](https://duanenewman.net/blog/post/forcing-a-specific-target-platform-with-packagereference/).
## Saying Thanks
If you find this library to be useful, please star us [on GitHub](https://github.com/NightOwl888/NetFx.Polyfills) and consider a sponsorship so we can continue bringing you great free tools like this one. It really would make a big difference!
[![GitHub Sponsors](https://img.shields.io/badge/-Sponsor-fafbfc?logo=GitHub%20Sponsors)](https://github.com/sponsors/NightOwl888)