Как получить доступ к коду, заключенному в директивы определения другой сборки?

#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 все равно не работает.