关闭

Unity 使用 Unity 直接编译外部 DLL

标签: unity编辑器mono编译器
612人阅读 评论(1) 收藏 举报
分类:

原因

Unity 集成了 Mono 编译器,所以在 Unity 里面新建 C# 脚本的时候,会自动进行编译。那么,思考可以不可以借助 Unity 的编译接口,来编译外部 DLL 文件。查找 Unity 编辑器的接口,发现有个 API: 
 C# Code 
1
2
3
4
    public static string[] CompileCSharp(string[] sources, string[] references, string[] defines, string outputFile)
    {
      return MonoCSharpCompiler.Compile(sources, references, defines, outputFile);
    }
那么,来测试下这个接口。

测试准备

新建两个文件夹,一个放 Unity 测试工程,一个放外部 DLL 的源码文件,如下所示:

其中,C# 文件 MyUtilities.cs 代码如下:
 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

namespace DLLTest {

    public class MyUtilities {
    
        public int c;

        public void AddValues(int a, int b) {
            c = a + b;  
        }
    
        public static int GenerateRandom(int min, int max) {
            System.Random rand = new System.Random();
            return rand.Next(min, max);
        }
    }
}
编辑器脚本文件  MyCompile.cs 代码如下:
 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System.IO;
using UnityEditor;
using UnityEngine;

public class MyCompile
{
    [MenuItem("Tool/My Compile")]
    private static void DoMyCompile()
    {
        string srcPath = Path.Combine(Application.dataPath, "../../TestDLL");
        string[] sources = new[] {Path.Combine(srcPath, "MyUtilities.cs")};
        string[] references = new string[0];
        string[] defines = new string[0];
        string outputFile = Path.Combine(Application.dataPath, "TestDLL.dll");

        string[] msgs = EditorUtility.CompileCSharp(sources, references, defines, outputFile);
        foreach (var msg in msgs)
        {
            Debug.Log(msg);
        }

        string dllFile = "Assets/TestDLL.dll";
        if (File.Exists(dllFile))
        {
            AssetDatabase.ImportAsset(dllFile, ImportAssetOptions.ForceUpdate);
        }
    }
}
测试运行
点击菜单栏 "Tool/My Compile",等待执行完毕,可以看到如下:

可以看到已经生成了 DLL,并且其对应的 mdb 文件,也自动生成了。

新建个 Unity 脚本文件,来测试是否调用正常,代码如下:
 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using UnityEngine;
using DLLTest;

public class Test : MonoBehaviour
{
    void Start()
    {
        MyUtilities utils = new MyUtilities();
        utils.AddValues(23);
        print("2 + 3 = " + utils.c);
    }

    void Update()
    {
        print(MyUtilities.GenerateRandom(0100));
    }
}
挂载到场景物体上,运行显示如下:

证明可以调用正确。

测试错误

接下去测试外部 DLL 源码错误的情况下,会不会报告所在的错误。更改 MyUtilities.cs 里的 AddValues 方法,让其参数变量错误,更改为如下:
 C# Code 
1
2
3
        public void AddValues(int d, int b) {
            c = a + b;  
        }
再次运行编译,可以看到报告了如下错误:

更改回去,继续下面的测试。

测试自定义脚本

在外部创建脚本文件 MyBehaviour.cs,代码如下:
 C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;

namespace DLLTest 
{
    public class MyBehaviour : MonoBehaviour
    {
        void Start()
        {
            Debug.Log("MyBehaviour");
        }
    }
}
编译脚本里,将这个文件也加入编译,代码更改为:
 C# Code 
1
string[] sources = new[] {Path.Combine(srcPath, "MyUtilities.cs"), Path.Combine(srcPath, "MyBehaviour.cs") };
运行编译,可以看到报告缺少引用,如下所示:

那么将引用到的 DLL 文件路径也加入进去,更改编译脚本的代码,更改为:
 C# Code 
1
string[] references = new []{ Path.Combine(EditorApplication.applicationContentsPath, "Managed/UnityEngine.dll") };
再次运行编译,可以看到不再报错,挂载 MyBehaviour 脚本到物体上,运行,可以看到日志输出如下:

测试 Mac平台

可以看到在 Mac 平台也是支持编译外部 DLL,并且也会自动生成 mdb文件。

测试工程


0
0
查看评论

Unity 调用外部DLL插件

unity调用DLL
  • pool611
  • pool611
  • 2016-04-22 14:47
  • 1425

Unity3d调试外部dll

最近玩Unity用UnityVS+VS2013来调试脚本,
  • foreverml
  • foreverml
  • 2014-06-10 11:34
  • 1597

Unity编译dll

目前实现了个自定义log类,需要在输出日志处双击跳转到出错代码行,把log类编译成dll可以达到此目的。所以本文谈谈Unity中编译dll的相关方法。
  • doosy
  • doosy
  • 2014-12-31 16:11
  • 1238

[Unity3d]调用自己封装的dll

之前总感觉会封装dll组件的都是大牛级别的程序员做的事情,然后供给菜鸟级别的调用。感觉为了保护自己的源码不会被他人知道,然后就封装一个dll供人家调用,那样就觉得很牛,今天我也尝试摸索了一下,感觉也就那么回事,但只是简单的测试而已,其实会写封装的,封装的好的还是很牛的,哈哈,那让我们也来假装“牛”一...
  • s10141303
  • s10141303
  • 2013-12-04 23:49
  • 7861

Unity引用外部DLL库

[DllImport("库名称")] private static extern int Add(int x, int y); int sum = Add( 1, 2 ); Debug.Log( sum ); 注意引用头文件: System.Runtime.Compiler...
  • yuxikuo_1
  • yuxikuo_1
  • 2016-07-01 14:08
  • 577

Unity 导入C# DLL、C\C++ DLL 等外部库

Untiy 导入C# DLL、C\C++ DLL、OSX BUNDLE、iOS Android 等插件。
  • l773575310
  • l773575310
  • 2017-05-18 12:00
  • 2227

如何将Unity中的脚本文件转为dll文件

本篇文章讨论的是如何吧unity中的脚本文件转为dll文件 如果想使用unity的api,则需要引入unity的,分别是 UnityEditor.dll 和 UnityEngine.dll,它们的地址如下: 这时候该把dll文件引入进来 下面就在unity中新建一个C#类脚本,脚...
  • qq_15267341
  • qq_15267341
  • 2016-06-23 21:57
  • 5185

Unity中使用和调试Dll

原文地址:http://jacksondunstan.com/articles/3052?utm_source=tuicool 正文: 本文意在指导你在Unity中创建、使用和调试一个.NET dll。你可以模块化你的代码,把它们组织成库,这样开发者只要导入一个单独的文件就可以使用你的库。从代码设计...
  • green_tea_great
  • green_tea_great
  • 2015-05-27 17:51
  • 4456

在Unity3D里使用DLL

开始第一篇的内容:首先,我们需要新建一个类库项目,可以使用Visual Studio或者Monodevelop来做。我这里是使用vs2012来创建: 选择好项目类型、写好项目名称。 新生成的项目里面默认有一个Class1类 可以通过在解决方案资源管理器里面进行重命名改成...
  • Kaitiren
  • Kaitiren
  • 2015-06-12 11:06
  • 7707

将Unity的脚本封装为dll文件(使用monodevelop编译器)

首先说一下生成dll文件的必要性:给第三方公司提供Unity插件,又不希望对方看到具体的实现过程,这时候就需要将核心代码封装编译成dll文件,供第三方调用。或是多个项目都要用到同一个模块或同样的功能,则可以把该模块或是功能编译成dll,方便复用和维护。     ...
  • qq_25210959
  • qq_25210959
  • 2016-11-22 14:18
  • 3204
    个人资料
    • 访问:3548462次
    • 积分:36043
    • 等级:
    • 排名:第137名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3424条
    个人说明
    联系方式:
    文章存档
    最新评论