使用引用项目中已有程序集的 dll

Using dll that references assemblies already in project

所以我在 Unity 中有一个项目应该能够从另一个程序导出的程序集中加载和实例化 classes。它是这样的:

  1. 必要的文件从 Unity 项目导出为 DLL
  2. 其他程序加载此 DLL 并使用它创建新的 class(即调用原始 Unity 应用程序中的方法),然后将其编译为另一个 DLL
  3. 原始 Unity 应用加载此 DLL 并运行新创建的 class

但是,当我进行到第3步时,它在原始Unity项目中的类似功能是重复的,我遇到了冲突。我想这是有道理的,因为当您编译 DLL 时,它必须解析所有引用。

然后我尝试这样做,这样原始的 Unity 项目将采用其他程序生成的代码(文本,而不是 dll)并在运行时编译它。这适用于 Windows,但问题是这是一个 Android 应用程序,当我构建到 phone 时,我使用 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)分离到一个单独的项目中,而不是使用具体的 classes 我创建了一些接口。例如,这些接口之一是 "IFunctionLibrary",它包含可以使用的必要功能的签名。主应用程序然后实现它。然后用于构建自定义脚本的应用程序知道具体库将实现哪些功能。

引用存储在导出的具体对象中 class 到满足接口的对象,在实例化时,主应用程序将接口的实现注入其中。

基本上这两个应用程序现在共享库。这意味着我不必 运行 上的编译器 phone,说实话更好。

希望这对以后的人有所帮助。抱歉,我无法显示太多实际代码,但它非常私密。