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

Posted

技术标签:

【中文标题】使用引用项目中已有程序集的 dll【英文标题】:Using dll that references assemblies already in project 【发布时间】:2020-01-03 16:58:25 【问题描述】:

所以我在 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 一无所知,但为什么 Roslyn 会参与其中? Roslyn 不是原创,我只是试了一下,看看能不能解决问题。原始代码(也是我想使用的)只是使用 CSharpCodeProvider。 我仍然无法理解您为什么需要生成代码。 允许用户通过可视化脚本器(即另一个应用程序)创建自定义脚本,以便程序生成代码,然后需要对其进行编译,以便它可以由主应用程序运行. :) 【参考方案1】:

所以我设法想出了一个使用依赖注入的解决方案。

基本上,我将共享代码文件(即原始 Unity 应用程序导出的 DLL)分离到一个单独的项目中,而不是创建一些具体的类,而是创建了一些接口。例如,这些接口之一是“IFunctionLibrary”,它包含可以使用的必要函数的签名。然后主应用程序实现了这一点。然后用于构建自定义脚本的应用程序知道具体库将实现哪些功能。

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

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

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

【讨论】:

以上是关于使用引用项目中已有程序集的 dll的主要内容,如果未能解决你的问题,请参考以下文章

vs中程序集的引用

设置程序PrivatePath,配置引用程序集的路径(分离exe和dll)

如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?

从 Asp.Net 4 项目进入引用的 .Net 3.5 程序集

共享程序集GAC

C#-using与添加引用的关系