Использование dll, которая ссылается на сборки, уже находящиеся в проекте

Итак, у меня есть проект в Unity, который должен иметь возможность загружать и создавать экземпляры классов из сборки, экспортированной из другой программы. Это выглядит так:

  1. Необходимые файлы экспортируются как DLL из проекта Unity.
  2. Другая программа загружает эту DLL и использует ее для создания нового класса (т. е. вызова методов в исходном приложении Unity), который затем компилируется в другую DLL.
  3. Исходное приложение Unity загружает эту DLL и запускает только что созданный класс.

Однако, когда я перехожу к шагу 3, аналогичные функции в исходном проекте Unity дублируются, и возникают конфликты. Я думаю, это имеет смысл, потому что когда вы компилируете DLL, она должна разрешать все ссылки.

Затем я попытался сделать это, чтобы исходный проект Unity брал код, сгенерированный другой программой (текст, а не dll), и компилировал его во время выполнения. Это работало в Windows, но проблема в том, что это приложение для Android, и когда я собираю его на телефон, я получаю следующее исключение, используя CSharpCodeProvider для компиляции:

2019/08/29 14:40:45.424 20040 20069 Error Unity DirectoryNotFoundException: Could not find a part of the path "/tmp/a6icqx2c.tmp".
2019/08/29 14:40:45.424 20040 20069 Error Unity at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x00164] in <7d97106330684add86d080ecf65bfe69>:0 
2019/08/29 14:40:45.424 20040 20069 Error Unity at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean isAsync, System.Boolean anonymous) [0x00000] in <7d97106330684add86d080ecf65bfe69>:0 
2019/08/29 14:40:45.424 20040 20069 Error Unity at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access) [0x00000] in <7d97106330684add86d080ecf65bfe69>:0 
2019/08/29 14:40:45.424 20040 20069 Error Unity at (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess)
2019/08/29 14:40:45.424 20040 20069 Error Unity at System.CodeDom.Compiler.TempFileCollection.EnsureTempNameCreated () [0x00076] in <0079a30f96a047348857e1cecc6c638a>:0 
2019/08/29 14:40:45.424 20040 20069 Error Unity at System.Co

К сожалению, остальное обрезано. Я попытался использовать Roslyn и также получил исключение DirectoryNotFoundException. Кто-нибудь знает, как я могу исправить это исключение или создать файл DLL в другом приложении, чтобы он правильно вызывал методы в исходном приложении?


person Tiernan Watson    schedule 30.08.2019    source источник
comment
Я ничего не знаю о Unity, но при чем тут Рослин?   -  person Paulo Morgado    schedule 31.08.2019
comment
Рослин изначально не участвовал, я только попробовал, чтобы посмотреть, решит ли это проблему. Исходный код (и тот, который я хотел бы использовать) просто использует CSharpCodeProvider.   -  person Tiernan Watson    schedule 01.09.2019
comment
Я все еще не понимаю, зачем вам нужно генерировать код.   -  person Paulo Morgado    schedule 01.09.2019
comment
Пользователю разрешено создавать пользовательские сценарии с помощью визуального скриптера (это другое приложение), поэтому программа генерирует код, а затем его необходимо скомпилировать, чтобы его можно было запустить в основном приложении. :)   -  person Tiernan Watson    schedule 01.09.2019


Ответы (1)


Поэтому мне удалось найти решение с использованием внедрения зависимостей.

По сути, я выделил общие файлы кода (то есть DLL, экспортируемые исходным приложением Unity) в отдельный проект и вместо конкретных классов создал несколько интерфейсов. Например, одним из таких интерфейсов является «IFunctionLibrary», который содержит сигнатуры для необходимых функций, которые можно использовать. Затем основное приложение реализует это. Затем приложение, которое используется для создания пользовательских сценариев, знает, какие функции будут реализованы конкретной библиотекой.

Ссылки хранятся в конкретном экспортируемом классе на объекты, которые удовлетворяют интерфейсам, и при создании экземпляра основное приложение внедряет в него свою реализацию интерфейсов.

По сути, оба приложения теперь совместно используют библиотеку. Это означает, что мне не нужно запускать компилятор на телефоне, что, честно говоря, лучше.

Надеюсь, это может помочь кому-то в будущем. Извините, я не могу показать много фактического кода, но он довольно приватный.

person Tiernan Watson    schedule 03.09.2019