【问题标题】:Use .NET DLL on multiple platforms在多个平台上使用 .NET DLL
【发布时间】:2013-08-08 12:51:52
【问题描述】:

我正在使用 C# 创建一个使用 MonoGame 的游戏,我希望在多个平台上使用它(我知道 MonoGame 可以做到)。

有没有办法在 C# 中创建一个 .dll 并从其他操作系统(最好是 iOS、Android 和 MacOS)加载它而无需重新编译库?我准备为每个平台编写一个“加载器”应用程序,但不想重写整个项目。

我希望有一种方法可以在这些平台上从 .net dll 加载函数(即加载游戏),而无需使用 MonoTouch 等付费产品。

【问题讨论】:

    标签: c# android ios dll monogame


    【解决方案1】:

    基本上,.NET/Mono 程序集都被编译成 CIL 代码,这是一个 ECMA 标准。

    但是,您仍然必须以不依赖于操作系统细节的方式对游戏进行编程。

    • 不要引用某些 .NET 程序集(即没有 WCF,因为它只有有限的 WCF 支持,根本没有 WPF,没有 WWF)
    • 不要引用特定于操作系统的 DLL(即没有对 kernel32.dll 的 P/Invokes 等。
    • 不要使用特定于操作系统的路径或使用预处理器指令来生成特定于操作系统的代码(是的,这将需要重新编译,您可能不会轻易解决这个问题)

    Mono 上的线程有一些问题,因此您可能必须使用预处理器指令编写特定于平台的代码。

    老实说,我认为重新编译代码没有问题,如果代码写得很清楚,只需将新项目添加到解决方案文件并设置预处理器标志即可。然后您所要做的就是编译解决方案并在您的 bin 文件夹中有多个 DLL。没有人说过你必须重写整个项目(除非项目已经完成并且有上面提到的任何依赖项),在这种情况下......这是你自己的错,你不必考虑它在开始开发之前。

    您只需使用所需的 Mono 运行时部署您的应用程序(在 iOS 等上)。为此,您可能需要 Xamarin 之类的东西或连接您自己的 Mono 运行时

    参考链接: http://www.mono-project.com/Compatibility http://www.mono-project.com/MoMA

    【讨论】:

    • 在这里感谢您的建议。
    • 通过重新编译,我不希望这样做,但似乎我必须这样做。但是使用 Xamarin(一种商业产品)是一个问题。
    • 让应用程序运行并加载和解释诸如 JavaScript 之类的东西可能是更好的解决方案吗?这可能允许更多的代码重用
    • 这通常不是什么大问题,98% 的代码都可以工作。但是例如,您不应该针对 .NET 4.5 API 编写游戏,因为 Mono 还不完全支持它(尤其是新的异步内容)。如果不遵守单声道库,特殊文件夹也可能无法在手机上正常工作。 Windows 不存在某些特殊文件夹。您可以在此页面上大致了解哪些有效,哪些无效(.NET Framework 兼容性)mono-project.com/Compatibilitymono-project.com/MoMA
    • 您可以在没有 Xamarin 的情况下连接自己的运行时,但这可能比仅仅购买 Xamarin 许可证需要更多的精力和成本。这就是人们购买它的原因。
    【解决方案2】:

    您可以查看 Xamarin 框架。但是你总是必须重新编译你的项目。 Xamarin

    在这些平台上不使用 MonoTouch 等付费产品。

    这会很困难。

    【讨论】:

    • MonoTouch 是 Xamarin.iOS。这是我试图避免的。
    • 另外,这可能是完全错误的,但我听说过 P/Invoke 可以用来调用 dll 函数。这可以在其他平台上使用吗?
    • 其他平台没有像 Microsoft 这样的 DLL。所以我认为,这没有用
    • 虽然我注意到在Unity创建的iOS应用中,.app文件夹中有DLL文件。我不知道它们是如何使用的,但这表明在 iOS 中可能有一些方法可以调用 DLL 函数。
    • Unity 提供了它自己的单声道运行时(例如,用于 Android 的 libmono.so 和 libmono_proxy.so),它将执行 Mono/.NET 程序集。在 Windows 8 和 Win8Phone/WinRT 上,unity 可以运行单声道,因此它们必须在 Win8/Win8Phone/WinRT .NET Framework 上运行 .NET 程序集。为此需要预处理器指令(即#if FXCORE45 或类似的东西)。统一也需要为每个平台重新编译。但是,如果您有特定于平台的代码(即 iOS 游戏中心集成,那么您需要预处理器指令,因为 iOS Gamecenter 在其他平台上不可用)
    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多