C# 在多个平台上使用.NET DLL

C# 在多个平台上使用.NET DLL,c#,android,ios,dll,monogame,C#,Android,Ios,Dll,Monogame,我正在使用C#创建一个使用MonoGame的游戏,我希望在多个平台上使用它(我知道MonoGame可以做到这一点) 有没有一种方法可以在C#中创建一个.dll并从其他操作系统(最好是iOS、Android和MacOS)加载它,而无需重新编译库?我准备为每个平台编写一个“加载器”应用程序,但不想重写整个项目 我希望有一种方法可以在这些平台上从.net dll加载函数(即加载游戏),而无需使用MonoTouch等付费产品。您可以查看Xamarin框架。但是你总是需要重新编译你的项目。 在这些平台上

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

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


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

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

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


这将很困难。

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

然而,你仍然需要以一种不依赖操作系统细节的方式来编程你的游戏

  • 不要引用某些.NET程序集(即没有WCF,因为它只有有限的WCF支持,根本没有WPF,没有WWF)
  • 不要引用特定于操作系统的dll(例如,没有对kernel32.dll的P/Invokes等)
  • 不要使用特定于操作系统的路径或使用预处理器指令来生成特定于操作系统的代码(是的,这将需要重新编译,您可能无法轻松解决此问题)
Mono上的线程有一些缺陷,因此您可能必须使用预处理器指令生成特定于平台的代码

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

你只需要使用所需的Mono运行时部署你的应用程序(在iOS等平台上)。为此,你可能需要像Xamarin这样的东西,或者连接你自己的Mono运行时

参考链接:

MonoTouch是Xamarin.iOS。这是我试图避免的。同样,这可能是完全错误的,但我听说过p/Invoke可以用来调用dll函数。这可以从另一个平台上运行吗?其他平台没有像Microsoft这样的dll。所以我想,这并没有什么问题。尽管我注意到在Unity创建的iOS应用程序中e是.app文件夹中的DLL文件。我不知道它们是如何使用的,但这表明可能有某种方法可以在iOS中调用DLL函数。Unity提供了自己的mono运行时(例如Android的libmono.so和libmono_proxy.so)它将执行Mono/.NET程序集。在Windows 8和Win8Phone/WinRT上,unity可以运行Mono,因此它们必须在Win8/Win8Phone/WinRT.NET框架上运行.NET程序集。为此,需要预处理器指令(即
#如果FXCORE45
或类似的指令).和unity也需要为每个平台重新编译。但如果您有特定于平台的代码(即iOS game center集成,则需要预处理器指令,因为iOS game center在其他平台上不可用)谢谢你的建议。通过重新编译,我不想这样做,但似乎我不得不这样做。但是使用Xamarin(一种商业产品)这是一个问题。更好的解决方案是让应用程序运行、加载和解释JavaScript之类的东西吗?这可能会允许更多的代码重用。这通常不是一个大问题,98%的代码都可以工作。但例如,你不应该针对.NET 4.5 API编写游戏,因为Mono还不完全支持它(特别是新的异步功能)。此外,如果mono库不符合要求,则特殊文件夹可能无法在手机上正常工作。windows中不存在某些特殊文件夹。您可以在此页面上大致了解哪些可用,哪些不可用(.NET Framework兼容性)您可以在没有Xamarin的情况下连接自己的运行时,但这可能需要比购买Xamarin许可证更多的精力和成本。这就是人们购买它的原因。