コード例 #1
0
    public static void ValidateLoadUnmanagedDll()
    {
        Console.WriteLine($"Running {nameof(ValidateLoadUnmanagedDll)}...");

        ALC alc = new ALC();
        var asm = alc.LoadFromAssemblyPath(Assembly.GetExecutingAssembly().Location);

        Console.WriteLine(" -- Validate explicit load...");

        // ALC implementation returns a fake handle value
        IntPtr ptr = NativeLibrary.Load(FakeNativeLibrary.Name, asm, null);

        alc.Validate(FakeNativeLibrary.Name);
        Assert.Equal(FakeNativeLibrary.Handle, ptr);

        alc.Reset();
        ptr = IntPtr.Zero;

        bool success = NativeLibrary.TryLoad(FakeNativeLibrary.Name, asm, null, out ptr);

        Assert.True(success, $"NativeLibrary.TryLoad should have succeeded");
        alc.Validate(FakeNativeLibrary.Name);
        Assert.Equal(FakeNativeLibrary.Handle, ptr);

        alc.Reset();

        // ALC implementation calls NativeLibrary.TryLoad with a different name
        ptr = NativeLibrary.Load(FakeNativeLibrary.RedirectName, asm, null);
        alc.Validate(FakeNativeLibrary.RedirectName, FakeNativeLibrary.Name);
        Assert.Equal(FakeNativeLibrary.Handle, ptr);

        alc.Reset();
        ptr = IntPtr.Zero;

        success = NativeLibrary.TryLoad(FakeNativeLibrary.RedirectName, asm, null, out ptr);
        Assert.True(success, $"NativeLibrary.TryLoad should have succeeded");
        alc.Validate(FakeNativeLibrary.RedirectName, FakeNativeLibrary.Name);
        Assert.Equal(FakeNativeLibrary.Handle, ptr);

        alc.Reset();

        Console.WriteLine(" -- Validate p/invoke...");
        int addend1  = rand.Next(int.MaxValue / 2);
        int addend2  = rand.Next(int.MaxValue / 2);
        int expected = addend1 + addend2;

        int value = NativeSumInAssemblyLoadContext(alc, addend1, addend2);

        alc.Validate(NativeLibraryToLoad.InvalidName);
        Assert.Equal(expected, value);
    }