所以我在 Unity 中有一个项目,它应该能够从从另一个程序导出的程序集加载和实例化类。 它是这样的:
- 必要的文件从 Unity 项目导出为 DLL
- 其他程序加载此 DLL 并使用它来创建一个新类(即在原始 Unity 应用程序中调用方法(,然后将其编译为另一个 DLL
- 原始 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 文件,以便它在原始应用程序中正确调用方法?
所以我设法提出了一个使用依赖注入的解决方案。
基本上,我将共享代码文件(即原始 Unity 应用程序导出的 DLL(分离到一个单独的项目中,而不是使用具体的类,我创建了一些接口,而不是使用具体的类。 例如,其中一个接口是"IFunctionLibrary",它包含可以使用的必要函数的签名。 然后,主应用程序实现这一点。 然后,用于构建自定义脚本的应用知道具体库将实现哪些函数。
引用存储在具体导出的类中,指向满足接口的对象的对象,在实例化时,主应用将其接口实现注入其中。
基本上,两个应用程序现在共享库。 这意味着我不必在手机上运行编译器,说实话,这更好。
希望这可以帮助将来的某人。 抱歉,我无法显示太多实际代码,但它非常私密。