Как использовать JSExport в двух проектах в одном веб-приложении + C#C#

Место общения программистов C#
Ответить
Anonymous
 Как использовать JSExport в двух проектах в одном веб-приложении + C#

Сообщение Anonymous »

Я начал с работающего приложения со статическими экспортированными методами C#, например

Код: Выделить всё

[SupportedOSPlatform("browser")] // suppress CA1416 "only supported on: 'browser'"
public static partial class Code
{
[JSExport]
public static string NameOf([JSMarshalAs] object entity)
=> ((IHasName)entity).Name;
}
Затем я создал систему маршалинга для удобного использования C# в JS, чтобы вы могли писать, например,

Код: Выделить всё

import { DictionaryOfInt32_String } from 'csharp'; // generated TypeScript

let dict = DictionaryOfInt32_String.new(7); // .NET dictionary, capacity 7
dict.set(7, "se7en");                       // dict[7] = "se7en";
console.log(dict.get(7));
Но теперь я пытаюсь отделить код своего приложения от кода системы маршалинга, поэтому я создал дополнительную библиотеку JSMarshalerWasm:

Код: Выделить всё



net8.0
true
enable

true
obj/generated




...









net8.0
true
enable







Проект Marshaler не использует Microsoft.NET.Sdk.WebAssembly, поскольку каждый
проект WebAssembly требует метод Main() для предотвращения этой ошибки:

Программа не содержит статического метода Main, подходящего для точки входа

(Я не только не вызываю Main(), но даже не мог понять, как его вызвать.) Но если я добавлю метод Main() в оба проекта, возникнет следующая ошибка:

C:\Program Files\dotnet\sdk\9.0.305\Sdks\Microsoft.NET.Sdk.StaticWebAssets\targets\Microsoft.NET.Sdk.StaticWebAssets.targets(616,5): ошибка: конфликтующие ресурсы с одинаковым целевым путем «_framework/blazor.boot.json». Для ресурсов Identity: C:\Dev\MyApp\Server\MyAppWasm\bin\Debug\net8.0\wwwroot_framework\blazor.boot.json, SourceType: Computed, SourceId: MyAppWasm, ContentRoot: C:\Dev\MyApp\Server\MyAppWasm\bin\Debug\net8.0\wwwroot, BasePath: /, RelativePath: _framework/blazor.boot.json, AssetKind: Build, AssetMode: All, AssetRole: Primary, AssetRole: , AssetRole: , linkedAsset: , AssetTraitName: WasmResource, AssetTraitValue: манифест, Fingerprint: fmiu3i5gfl, Integrity: OYuLu5ui6DeTmqCHsz8viTMsr9s2gps4W8mqrbYrE4w=, FileLength: 22689, LastWriteTime: 05.11.2025 4:27:23 +00:00, CopyToOutputDirectory: PreserveNewest, CopyToPublishDirectory: Никогда, OriginalItemSpec: obj\Debug\net8.0\blazor.boot.json" и "Идентификация: C:\Dev\MyApp\Server\JSMarshalerWasm\bin\Debug\net8.0\wwwroot_framework\blazor.boot.json, SourceType: Project, SourceId: JSMarshalerWasm, ContentRoot: C:\Dev\MyApp\Server\JSMarshalerWasm\bin\Debug\net8.0\wwwroot, BasePath: /, RelativePath: _framework/blazor.boot.json, AssetKind: Build, AssetMode: All, AssetRole: Primary, AssetRole: , AssetRole: , linkedAsset: , AssetTraitName: WasmResource, AssetTraitValue: манифест, отпечаток пальца: qpeekuqssc, целостность: /q1cS1sIQjh1Us8LmqZQEEOpnikjG+LDv6FJZIMtp+U=, FileLength: 17475, LastWriteTime: 05.11.2025 4:26:53 +00:00, CopyToOutputDirectory: PreserveNewest, CopyToPublishDirectory: Never, OriginalItemSpec: obj\Debug\net8.0\blazor.boot.json' из разных проектов.

Поэтому вместо этого я использовал Microsoft.NET.Sdk, но тогда атрибуты JSExport в Marshaler не работают:

Код: Выделить всё

    import { dotnet } from '_framework/dotnet.js';
...
...
const { setModuleImports, getAssemblyExports, getConfig, runMain } = await dotnet
.withApplicationArguments('start')
.create();

const config = getConfig();

DotNetExports = await getAssemblyExports(config.mainAssemblyName);

// RUNTIME ERROR:
// TypeError: can't access property "Marshaler", DotNetExports.JSMarshaling is undefined
Marshaler = DotNetExports.JSMarshaling.Marshaler;
Примечание. это не приложение Blazor, но AFAICT Microsoft не дала имя своей системе .NET-in-WebAssembly. Если вы читаете это сообщение Microsoft, дайте своей системе имя, чтобы люди могли ее правильно обсуждать. Я вижу слово «blazor» в сообщении об ошибке выше, но Blazor — это система пользовательского интерфейса на C#, и я не выполняю никакой работы с пользовательским интерфейсом на C#.


Подробнее здесь: https://stackoverflow.com/questions/798 ... e-webc-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»