【问题标题】:Using Steam DRM with XNA / Monogame (C#)将 Steam DRM 与 XNA / Monogame (C#) 结合使用
【发布时间】:2016-01-24 01:43:42
【问题描述】:

我想使用 SteamWorks-API 中集成的 Steam DRM 来保护使用 XNA(或 Mac 和 Linux 的 Monogame/FNA)以 C# 实现的游戏。 Valve 本身仅在 C++ 中提供其 SteamWorks-API,但也有像 SteamWorks.Net für C# 这样的包装器。但是,据我所知,这些仅支持主要功能(如云保存和成就),但不支持 Steam DRM。

有没有办法将 Steam DRM 与 C# 游戏集成?

如果没有,有什么替代方案?

【问题讨论】:

    标签: c# xna steam drm steamworks-api


    【解决方案1】:

    操作:

    有没有办法将 Steam DRM 与 C# 游戏集成?

    直接?不,间接的?是的。让我解释一下……

    你真正想知道的是c#代码如何调用c++,答案是是的Tell me more。如果您查看链接,最好的答案是修改 c++ 代码以将其更改为混合 c++/CLI DLL。由于 Steam 提供的 API 无法做到这一点,因此另一种方法是创建一个 代理

    要做的事情(因为您不能修改 c++ DLL)是创建一个调用 Steam 的 new c++/CLI DLL(我们称之为 Proxy) C++ DLL (S) 代表您。这解决了 p-invoking 受 name mangling 约束的 c++ DLL 而不是不受 c DLL 约束的问题。 Proxy 公开混合了 c++ 和 .NET 的类。您的应用程序调用它认为只是代理内的 .NET 代码。 Proxy 然后调用 S 中的原始 c++ 代码。

    调用顺序如下:

    应用程序 --> 代理 --> S

    如果您发现代理实际上只是您自己的包装器 - 对于您的应用感兴趣的特定功能来说是一个非常简单的包装器,因此考虑到风险,再次依赖第三方包装器似乎不值得.您的代理中应该有任何特殊和/或复杂的业务逻辑。 保持简单。确保使用 Steam 的最新 API 更新您的 Steam 代码/库副本。

    操作:

    但也有像 SteamWorks.Net für C# 这样的包装器。但是,据我所知,这些仅支持主要功能(如云保存和成就),但不支持 Steam DRM

    就我个人而言,我不想依赖可能未经证实的;可能与 Steam 更改不同步;与 DRM 一样重要的第 3 方开源项目,所以我的建议是坚持使用 SteamWorks

    什么是 c++/CLI?

    简而言之,c++/CLI 是一种 Microsoft 技术,已经存在了一段时间,它允许您创建混合的 c++ 和 .NET DLL。您的代码可以访问 .NET 以及丰富的历史 c/c++ 代码和库。 .NET 代码可以调用混合 dll 中的公共 CLR 类型。

    更多

    • name mangling - c++ 编译器的一个有点烦人的方面,将方法名称(如 bool article::print_to (std::ostream&))转换为 _ZN9wikipedia7article8print_toERSo 原因有很多,其中一个原因是需要唯一命名,但会产生难以确定的不良副作用哪个导出是 p-invoke 的入口。

    【讨论】:

    • @Aravol 是的,我认为这是 "SteamWorks.Net für C#" 中的 OP 推断的。同样,我认为当 OP 刚刚在 DRM 方面之后,甚至在制作之后,为 SteamWorks (匹配;DLC;语音聊天等)拥有一个 whole .NET 包装器是矫枉过正的您自己的包装器/代理非常简单。代理中的代码最少。 :)
    • 感谢您提供如何使用 SteamWorks.dll(直接来自 Valve)的好主意,我一定会尝试这样做。但是,我认为即使使用建议的 C++/CLI 代理 dll,SteamWorks DRM 仍会包装为仍然是 C# 的可执行文件。
    • 此外,在 SteamWorks.net 常见问题解答中,他们指出: 问题:“Steam DRM 包装器是否适用于 Unity 或 XNA/Monogame?”回答“不,它没有。不幸的是,Steam DRM 包装器不能很好地与 Unity 等 .NET 应用程序配合使用,如果它被包装,您的应用程序可能无法启动。即使它成功并为您工作,它也经常会失败其他电脑。” steamworks.github.io/faq
    • Steam DRM 和 .NET 很有趣。 Steam 本身说 "Do you have a .NET or Actionscript wrapper?...We do not have any wrappers available as part of the SDK." 然后他们说 "Do you have a DRM solution for .NET...We currently do not have a way to DRM these titles" 但不清楚这是否意味着他们不完全支持 .NET 进程,或者他们只是SDK 中没有 .NET 支持。 Steam 上毕竟有 XNA 游戏(无法确认 DRM)。不知道...
    【解决方案2】:

    根据Steamworks.NET

    Steam DRM 包装器能否与 Unity 或 XNA/Monogame 一起使用?

    不,它没有。不幸的是,Steam DRM 包装器的播放效果不佳 使用 Unity 等 .NET 应用程序,您的应用程序可能会 如果它被包装,则无法启动。即使它确实成功并为 你它经常会在其他计算机上失败。

    所以至少有一个主要的实现发现这个确切的方面是站不住脚的。

    请注意,multiple steam games 使用第三方许可软件,而不是集成到 Steam 中,而是在启动时显示产品密钥。这可能有助于打开您的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多