diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index e855baf..df166696 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -79,7 +79,8 @@
 
   char* lib_path = NULL;
   if (strncmp(lib_uri_str, "file://", 7) == 0) {
-    lib_path = DartUtils::DirName(lib_uri_str + 7);
+    auto path = File::UriToPath(lib_uri_str);
+    lib_path = DartUtils::DirName(path.get());
   } else {
     lib_path = Utils::StrDup(lib_uri_str);
   }
@@ -125,7 +126,8 @@
 
     char* lib_path = NULL;
     if (strncmp(lib_uri, "file://", 7) == 0) {
-      lib_path = DartUtils::DirName(DartUtils::RemoveScheme(lib_uri));
+      auto path = File::UriToPath(lib_uri);
+      lib_path = DartUtils::DirName(path.get());
     } else {
       lib_path = Utils::StrDup(lib_uri);
     }
diff --git a/samples/sample_extension/test/sample_extension_test_helper.dart b/samples/sample_extension/test/sample_extension_test_helper.dart
index d4cae3d..a4a78ce 100644
--- a/samples/sample_extension/test/sample_extension_test_helper.dart
+++ b/samples/sample_extension/test/sample_extension_test_helper.dart
@@ -44,6 +44,30 @@
   }
 }
 
+Future runTests(
+    String program, String testDirectory, String? snapshotKind) async {
+  for (var test in [
+    'test_sample_synchronous_extension.dart',
+    'test_sample_asynchronous_extension.dart'
+  ]) {
+    String script = join(testDirectory, test);
+    String snapshot;
+    if (snapshotKind == null) {
+      snapshot = script;
+    } else {
+      snapshot = join(testDirectory, "$test.snapshot");
+      await run(Platform.executable, <String>[
+        ...Platform.executableArguments,
+        '--snapshot=$snapshot',
+        '--snapshot-kind=$snapshotKind',
+        script
+      ]);
+    }
+
+    await run(program, <String>[...Platform.executableArguments, snapshot]);
+  }
+}
+
 Future testNativeExtensions(String? snapshotKind) async {
   String buildDirectory = dirname(Platform.executable);
   Directory tempDirectory =
@@ -63,27 +87,27 @@
       await copyFileToDirectory(join(sourceDirectory, file), testDirectory);
     }
 
-    for (var test in [
-      'test_sample_synchronous_extension.dart',
-      'test_sample_asynchronous_extension.dart'
-    ]) {
-      String script = join(testDirectory, test);
-      String snapshot;
-      if (snapshotKind == null) {
-        snapshot = script;
-      } else {
-        snapshot = join(testDirectory, "$test.snapshot");
-        List<String> args = new List<String>.from(Platform.executableArguments);
-        args.add('--snapshot=$snapshot');
-        args.add('--snapshot-kind=$snapshotKind');
-        args.add(script);
-        await run(Platform.executable, args);
-      }
+    // Test native library resolution when it's next to the binary
+    await runTests(Platform.executable, testDirectory, snapshotKind);
 
-      List<String> args = new List<String>.from(Platform.executableArguments);
-      args.add(snapshot);
-      await run(Platform.executable, args);
-    }
+    // Test native library resolution when it's next to the source
+    await copyFileToDirectory(
+        join(
+            buildDirectory,
+            (Platform.isWindows ? '' : 'lib') +
+                'sample_extension' +
+                (Platform.isWindows
+                    ? '.dll'
+                    : Platform.isMacOS
+                        ? '.dylib'
+                        : '.so')),
+        testDirectory);
+    Directory tempBinDirectory = Directory(join(tempDirectory.path, 'dart-bin'))
+      ..createSync();
+    await copyFileToDirectory(Platform.executable, tempBinDirectory.path);
+    String copyPlatformExecutable =
+        join(tempBinDirectory.path, basename(Platform.executable));
+    await runTests(copyPlatformExecutable, testDirectory, snapshotKind);
   } finally {
     tempDirectory.deleteSync(recursive: true);
   }
diff --git a/samples_2/sample_extension/test/sample_extension_test_helper.dart b/samples_2/sample_extension/test/sample_extension_test_helper.dart
index 9c701bf..cabbb28 100644
--- a/samples_2/sample_extension/test/sample_extension_test_helper.dart
+++ b/samples_2/sample_extension/test/sample_extension_test_helper.dart
@@ -26,7 +26,7 @@
       result = await Process.run('cmd.exe', ['/C', 'copy $src $dst']);
       break;
     default:
-      Expect.fail('Unknown operating system ${Platform.operatingSystem}');
+      throw 'Unknown operating system ${Platform.operatingSystem}';
   }
   if (result.exitCode != 0) {
     print(result.stdout);
@@ -46,6 +46,30 @@
   }
 }
 
+Future runTests(
+    String program, String testDirectory, String snapshotKind) async {
+  for (var test in [
+    'test_sample_synchronous_extension.dart',
+    'test_sample_asynchronous_extension.dart'
+  ]) {
+    String script = join(testDirectory, test);
+    String snapshot;
+    if (snapshotKind == null) {
+      snapshot = script;
+    } else {
+      snapshot = join(testDirectory, "$test.snapshot");
+      await run(Platform.executable, <String>[
+        ...Platform.executableArguments,
+        '--snapshot=$snapshot',
+        '--snapshot-kind=$snapshotKind',
+        script
+      ]);
+    }
+
+    await run(program, <String>[...Platform.executableArguments, snapshot]);
+  }
+}
+
 Future testNativeExtensions(String snapshotKind) async {
   String buildDirectory = dirname(Platform.executable);
   Directory tempDirectory =
@@ -65,27 +89,27 @@
       await copyFileToDirectory(join(sourceDirectory, file), testDirectory);
     }
 
-    for (var test in [
-      'test_sample_synchronous_extension.dart',
-      'test_sample_asynchronous_extension.dart'
-    ]) {
-      String script = join(testDirectory, test);
-      String snapshot;
-      if (snapshotKind == null) {
-        snapshot = script;
-      } else {
-        snapshot = join(testDirectory, "$test.snapshot");
-        List<String> args = new List<String>.from(Platform.executableArguments);
-        args.add('--snapshot=$snapshot');
-        args.add('--snapshot-kind=$snapshotKind');
-        args.add(script);
-        await run(Platform.executable, args);
-      }
+    // Test native library resolution when it's next to the binary
+    await runTests(Platform.executable, testDirectory, snapshotKind);
 
-      List<String> args = new List<String>.from(Platform.executableArguments);
-      args.add(snapshot);
-      await run(Platform.executable, args);
-    }
+    // Test native library resolution when it's next to the source
+    await copyFileToDirectory(
+        join(
+            buildDirectory,
+            (Platform.isWindows ? '' : 'lib') +
+                'sample_extension' +
+                (Platform.isWindows
+                    ? '.dll'
+                    : Platform.isMacOS
+                        ? '.dylib'
+                        : '.so')),
+        testDirectory);
+    Directory tempBinDirectory = Directory(join(tempDirectory.path, 'dart-bin'))
+      ..createSync();
+    await copyFileToDirectory(Platform.executable, tempBinDirectory.path);
+    String copyPlatformExecutable =
+        join(tempBinDirectory.path, basename(Platform.executable));
+    await runTests(copyPlatformExecutable, testDirectory, snapshotKind);
   } finally {
     tempDirectory.deleteSync(recursive: true);
   }
diff --git a/tools/VERSION b/tools/VERSION
index 27132aa..7d7fd15 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 189
+PRERELEASE 190
 PRERELEASE_PATCH 0
\ No newline at end of file
