diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Resources/Strings.resx b/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Resources/Strings.resx
index b06ebce2260316..059a4bfdd4dbbe 100644
--- a/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Resources/Strings.resx
+++ b/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Resources/Strings.resx
@@ -118,112 +118,112 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- Specified configuration is not supported by source-generated JavaScript interop.
+ Specified configuration is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- The '{0}' configuration is not supported by source-generated JavaScript interop.
+ The '{0}' configuration is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Source-generated JavaScript interop will ignore any configuration that is not supported.
+ Source-generated JavaScript interop will ignore any configuration that is not supported. For more information see https://aka.ms/dotnet-wasm-jsinterop
- The specified value '{0}' for '{1}' is not supported by source-generated JavaScript interop.
+ The specified value '{0}' for '{1}' is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- The specified marshalling configuration is not supported by source-generated JavaScript interop. {0}.
+ The specified marshalling configuration is not supported by source-generated JavaScript interop. {0}. For more information see https://aka.ms/dotnet-wasm-jsinterop
Specified type is not supported by source-generated JavaScript interop.
- {0} The generated source will not handle marshalling of the return value of method '{1}'.
+ {0} The generated source will not handle marshalling of the return value of method '{1}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
{0} is a message containing additional details about what is not supported
{1} is the name of the method
- Type is not supported by source-generated JavaScript interop.
+ Type is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- The type '{0}' is not supported by source-generated JavaScript interop. The generated source will not handle marshalling of parameter '{1}'.
+ The type '{0}' is not supported by source-generated JavaScript interop. The generated source will not handle marshalling of parameter '{1}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- The type '{0}' is not supported by source-generated JavaScript interop. The generated source will not handle marshalling of the return value of method '{1}'.
+ The type '{0}' is not supported by source-generated JavaScript interop. The generated source will not handle marshalling of the return value of method '{1}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- {0} The generated source will not handle marshalling of parameter '{1}'.
+ {0} The generated source will not handle marshalling of parameter '{1}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
{0} is a message containing additional details about what is not supported
{1} is the name of the parameter
- The specified '{0}' configuration for the return value of method '{1}' is not supported by source-generated JavaScript interop.
+ The specified '{0}' configuration for the return value of method '{1}' is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- The specified '{0}' configuration for parameter '{1}' is not supported by source-generated JavaScript interop.
+ The specified '{0}' configuration for parameter '{1}' is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Invalid 'JSImportAttribute' usage
+ Invalid 'JSImportAttribute' usage. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Invalid 'JSExportAttribute' usage
+ Invalid 'JSExportAttribute' usage. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Method '{0}' should be 'static', 'partial', and non-generic when marked with 'JSImportAttribute'. JavaScript interop source generation will ignore method '{0}'.
+ Method '{0}' should be 'static', 'partial', and non-generic when marked with 'JSImportAttribute'. JavaScript interop source generation will ignore method '{0}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Method '{0}' should be 'static', non-partial and non-generic when marked with 'JSExportAttribute'. JavaScript interop source generation will ignore method '{0}'.
+ Method '{0}' should be 'static', non-partial and non-generic when marked with 'JSExportAttribute'. JavaScript interop source generation will ignore method '{0}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Methods marked with 'JSImportAttribute' should be 'static', 'partial', and non-generic. JavaScript interop source generation will ignore methods that are non-'static', non-'partial', or generic.
+ Methods marked with 'JSImportAttribute' should be 'static', 'partial', and non-generic. JavaScript interop source generation will ignore methods that are non-'static', non-'partial', or generic. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Methods marked with 'JSImportAttribute' should be 'static', non-partial, and non-generic. JavaScript interop source generation will ignore methods that are non-'static', 'partial', or generic.
+ Methods marked with 'JSImportAttribute' should be 'static', non-partial, and non-generic. JavaScript interop source generation will ignore methods that are non-'static', 'partial', or generic. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Method '{0}' is contained in a type '{1}' that is not marked 'partial'. JavaScript interop source generation will ignore method '{0}'.
+ Method '{0}' is contained in a type '{1}' that is not marked 'partial'. JavaScript interop source generation will ignore method '{0}'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- 'JSType.Discard' could be only used with void return argument.
+ 'JSType.Discard' could be only used with void return argument. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Type {0} is not supported as argument of marshaled function.
+ Type {0} is not supported as argument of marshaled function. For more information see https://aka.ms/dotnet-wasm-jsinterop
{0} is a type of the argument
- Only functions with up to 3 arguments are currently supported by source-generated JavaScript interop.
+ Only functions with up to 3 arguments are currently supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- 'JSType.Function' should have same number of generic arguments as the marshaled managed type.
+ 'JSType.Function' should have same number of generic arguments as the marshaled managed type. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Parameters with 'in', 'out' and 'ref' modifiers are not supported by source-generated JavaScript interop.
+ Parameters with 'in', 'out' and 'ref' modifiers are not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Marshaling 'Span' on method which returns 'Task' is not supported.
+ Marshaling 'Span' on method which returns 'Task' is not supported. For more information see https://aka.ms/dotnet-wasm-jsinterop
- Type {0} is not supported by source-generated JavaScript interop.
+ Type {0} is not supported by source-generated JavaScript interop. For more information see https://aka.ms/dotnet-wasm-jsinterop
{0} is a type of the argument
- Please annotate the argument with 'JSMarshalAsAttribute' to specify marshaling of {0}.
+ Please annotate the argument with 'JSMarshalAsAttribute' to specify marshaling of {0}. For more information see https://aka.ms/dotnet-wasm-jsinterop
{0} is a type of the argument
- JSImportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'.
+ JSImportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- JSImportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'.
+ JSImportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- JSImportAttribute requires unsafe code.
+ JSImportAttribute requires unsafe code. For more information see https://aka.ms/dotnet-wasm-jsinterop
- JSExportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'.
+ JSExportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- JSExportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'.
+ JSExportAttribute requires unsafe code. Project must be updated with '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'. For more information see https://aka.ms/dotnet-wasm-jsinterop
- JSExportAttribute requires unsafe code.
+ JSExportAttribute requires unsafe code. For more information see https://aka.ms/dotnet-wasm-jsinterop
\ No newline at end of file
diff --git a/src/mono/wasm/runtime/marshal-to-cs.ts b/src/mono/wasm/runtime/marshal-to-cs.ts
index a0f5b58a5cd332..14d6c7e3dd7479 100644
--- a/src/mono/wasm/runtime/marshal-to-cs.ts
+++ b/src/mono/wasm/runtime/marshal-to-cs.ts
@@ -24,6 +24,7 @@ import { TypedArray } from "./types/emscripten";
import { addUnsettledPromise, settleUnsettledPromise } from "./pthreads/shared/eventloop";
import { mono_log_warn } from "./logging";
+export const jsinteropDoc = "For more information see https://aka.ms/dotnet-wasm-jsinterop";
export function initialize_marshalers_to_cs(): void {
if (js_to_cs_marshalers.size == 0) {
@@ -389,7 +390,7 @@ export function marshal_js_object_to_cs(arg: JSMarshalerArgument, value: any): v
}
else {
// if value was ManagedObject, it would be double proxied, but the C# signature requires that
- mono_check(value[js_owned_gc_handle_symbol] === undefined, "JSObject proxy of ManagedObject proxy is not supported");
+ mono_check(value[js_owned_gc_handle_symbol] === undefined, () => `JSObject proxy of ManagedObject proxy is not supported. ${jsinteropDoc}`);
mono_check(typeof value === "function" || typeof value === "object", () => `JSObject proxy of ${typeof value} is not supported`);
set_arg_type(arg, MarshalerType.JSObject);
@@ -474,7 +475,7 @@ function _marshal_cs_object_to_cs(arg: JSMarshalerArgument, value: any): void {
else {
assert_not_disposed(value);
if (value instanceof ArraySegment) {
- throw new Error("NotImplementedException: ArraySegment");
+ throw new Error("NotImplementedException: ArraySegment. " + jsinteropDoc);
}
else if (value instanceof ManagedError) {
set_arg_type(arg, MarshalerType.Exception);
@@ -484,7 +485,7 @@ function _marshal_cs_object_to_cs(arg: JSMarshalerArgument, value: any): void {
set_arg_type(arg, MarshalerType.Object);
set_gc_handle(arg, gc_handle);
} else {
- throw new Error("NotImplementedException " + js_type);
+ throw new Error("NotImplementedException " + js_type + ". " + jsinteropDoc);
}
}
}
diff --git a/src/mono/wasm/runtime/marshal-to-js.ts b/src/mono/wasm/runtime/marshal-to-js.ts
index 9b5a931067fda6..1ad71dbc4ae784 100644
--- a/src/mono/wasm/runtime/marshal-to-js.ts
+++ b/src/mono/wasm/runtime/marshal-to-js.ts
@@ -18,7 +18,7 @@ import {
import { monoStringToString } from "./strings";
import { JSHandleNull, GCHandleNull, JSMarshalerArgument, JSMarshalerArguments, JSMarshalerType, MarshalerToCs, MarshalerToJs, BoundMarshalerToJs, MarshalerType } from "./types/internal";
import { TypedArray } from "./types/emscripten";
-import { get_marshaler_to_cs_by_type } from "./marshal-to-cs";
+import { get_marshaler_to_cs_by_type, jsinteropDoc } from "./marshal-to-cs";
import { localHeapViewF64, localHeapViewI32, localHeapViewU8 } from "./memory";
export function initialize_marshalers_to_js(): void {
@@ -85,7 +85,7 @@ export function get_marshaler_to_js_by_type(marshaler_type: MarshalerType): Mars
return undefined;
}
const converter = cs_to_js_marshalers.get(marshaler_type);
- mono_assert(converter && typeof converter === "function", () => `ERR41: Unknown converter for type ${marshaler_type}`);
+ mono_assert(converter && typeof converter === "function", () => `ERR41: Unknown converter for type ${marshaler_type}. ${jsinteropDoc}`);
return converter;
}
@@ -224,7 +224,7 @@ export function marshal_task_to_js(arg: JSMarshalerArgument, _?: MarshalerType,
// when we arrived here from _marshal_cs_object_to_js
res_converter = cs_to_js_marshalers.get(type);
}
- mono_assert(res_converter, () => `Unknown sub_converter for type ${MarshalerType[type]} `);
+ mono_assert(res_converter, () => `Unknown sub_converter for type ${MarshalerType[type]}. ${jsinteropDoc}`);
// this is already resolved
const val = res_converter(arg);
@@ -256,7 +256,7 @@ export function marshal_task_to_js(arg: JSMarshalerArgument, _?: MarshalerType,
// when we arrived here from _marshal_cs_object_to_js
res_converter = cs_to_js_marshalers.get(type);
}
- mono_assert(res_converter, () => `Unknown sub_converter for type ${MarshalerType[type]}`);
+ mono_assert(res_converter, () => `Unknown sub_converter for type ${MarshalerType[type]}. ${jsinteropDoc}`);
const js_value = res_converter!(argInner);
orig_resolve(js_value);
@@ -291,7 +291,7 @@ export function mono_wasm_marshal_promise(args: JSMarshalerArguments): void {
else if (value_type !== MarshalerType.Task) {
// this is already resolved task
const sub_converter = cs_to_js_marshalers.get(value_type);
- mono_assert(sub_converter, () => `Unknown sub_converter for type ${MarshalerType[value_type]} `);
+ mono_assert(sub_converter, () => `Unknown sub_converter for type ${MarshalerType[value_type]}. ${jsinteropDoc}`);
const data = sub_converter(arg_value);
promise_control.resolve(data);
}
@@ -406,7 +406,7 @@ function _marshal_cs_object_to_js(arg: JSMarshalerArgument): any {
// other types
const converter = cs_to_js_marshalers.get(marshaler_type);
- mono_assert(converter, () => `Unknown converter for type ${MarshalerType[marshaler_type]}`);
+ mono_assert(converter, () => `Unknown converter for type ${MarshalerType[marshaler_type]}. ${jsinteropDoc}`);
return converter(arg);
}
@@ -461,7 +461,7 @@ function _marshal_array_to_js_impl(arg: JSMarshalerArgument, element_type: Marsh
result = sourceView.slice();//copy
}
else {
- throw new Error(`NotImplementedException ${MarshalerType[element_type]} `);
+ throw new Error(`NotImplementedException ${MarshalerType[element_type]}. ${jsinteropDoc}`);
}
Module._free(buffer_ptr);
return result;
@@ -483,7 +483,7 @@ function _marshal_span_to_js(arg: JSMarshalerArgument, element_type?: MarshalerT
result = new Span(buffer_ptr, length, MemoryViewType.Double);
}
else {
- throw new Error(`NotImplementedException ${MarshalerType[element_type]} `);
+ throw new Error(`NotImplementedException ${MarshalerType[element_type]}. ${jsinteropDoc}`);
}
return result;
}
@@ -504,7 +504,7 @@ function _marshal_array_segment_to_js(arg: JSMarshalerArgument, element_type?: M
result = new ArraySegment(buffer_ptr, length, MemoryViewType.Double);
}
else {
- throw new Error(`NotImplementedException ${MarshalerType[element_type]} `);
+ throw new Error(`NotImplementedException ${MarshalerType[element_type]}. ${jsinteropDoc}`);
}
const gc_handle = get_arg_gc_handle(arg);
if (BuildConfiguration === "Debug") {