#unity3d #preprocessor-directive
Вопрос:
Я застрял и надеюсь, что кто-то знаком с assemblies
platform-dependent
компиляцией and. Я не могу вызывать классы в других сборках, которые обернуты директивами препроцессора / директивами определения. Без наличия директив все идет нормально. Кроме того, я не могу обращаться к коду в сборках, ограниченных платформой. Это преднамеренное поведение или что-то не так?
Тестовый класс:
public class Main
{
public void Test()
{
/// Classes In Same Assembly
/// ---------------------
UnrestrictedClassSameAssembly.Test(); // Works as intended
#if WINDOWS_UWP
UWPClassSameAssembly.Test(null); // Works as intended
#endif
/// Classes In Other Assembly
/// ---------------------
UnrestrictedClassOtherAssembly.Test(); // Works as intended
// Does NOT work as intended
// The name UWPClassOtherAssembly does not exist in the current context
#if WINDOWS_UWP
UWPClassOtherAssembly.Test(null);
#endif
/// Class In WSA Assembly
/// ---------------------
///
// Does NOT work as intended
// The name ClassUWPAssembly does not exist in the current context
#if WINDOWS_UWP
ClassUWPAssembly.Test(null);
#endif
}
}
SameAssemblyClasses.cs:
//Is in MainAssembly
public static class UnrestrictedClassSameAssembly
{
public static void Test(){ }
}
#if WINDOWS_UWP
public static class UWPClassSameAssembly
{
public static void Test(Windows.Storage.StorageFolder sf){ }
}
#endif
OtherAssemblyClasses.cs:
//Is in OtherAssembly
public static class UnrestrictedClassOtherAssembly
{
public static void Test() { }
}
#if WINDOWS_UWP
public static class UWPClassOtherAssembly
{
public static void Test(Windows.Storage.StorageFolder sf) { }
}
#endif
UWPClass.cs:
//Is in UWPAssembly
public static class ClassUWPAssembly
{
public static void Test(Windows.Storage.StorageFolder sf) { }
}
Определения сборок:
{
"name": "MainAssembly",
"rootNamespace": "",
"references": [
"OtherAssembly",
"UWPAssembly"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}
{
"name": "OtherAssembly",
"rootNamespace": "",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}
{
"name": "UWPAssembly",
"rootNamespace": "",
"references": [],
"includePlatforms": [
"WSA"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}
Комментарии:
1. Ну, я думаю, вы можете получить доступ к коду, если он скомпилирован для вашей платформы… вы не сможете использовать его, если вы находитесь на платформе, для которой код не компилируется либо из-за препроцессоров, либо из-за того, что вся сборка исключена на этой платформе… Может быть, я не совсем понимаю ваш вопрос?
2. Какую версию Unity вы используете и откуда берется define
WINDOWS_UWP
? По-видимому, это не синхронизировано с платформой WSA?3. Проект основан на версии Unity 2020.3.20f1.
WINDOWS_UWP
указано в документах Unity . Мне это нужно, потому что я работаю сWindows.Storage
пространством имен иil2cpp
для доступа к данным на Hololens.4.
UNITY_WSA_10_0
->#define directive for Universal Windows Platform. Additionally WINDOWS_UWP is defined when compiling C# files against .NET Core.
… Я думаю, это просто не относится к вашей ситуации?5. Для параметров сборки установлено значение
UWP
. Когда я меняю директивы сWINDOWS_UWP
наUNITY_WSA
илиUNITY_WSA_10_0
,UWPClassOtherAssembly
появляется контекст. Однако он пытается загрузитьWindows
пространство имен в среде редактора, где его нет. ИClassUWPAssembly
все равно не работает.