【发布时间】:2021-03-13 04:55:36
【问题描述】:
我的问题实际上有两个变体,但在某些情况下,我有一个 C++ *.DLL,我使用 p/Invoke 与 Unity 一起使用。它使用 MSBuild(平台工具集:ClangCL)在 Windows 10 上构建。
现在我的问题,
- 特定类型的大小是否在构建 DLL之后保持不变?还是需要在目标平台(比如 Linux 或 Mac)上重新构建?
我的代码看起来有点像这样:
typedef wchar_t wchar;
static_assert(sizeof(wchar) == 2, "WideChar size-test failed.");
在 Windows 上重新编译源代码后,如果我为 Android 平台构建 Unity 项目,wchar 的大小是否也会保持不变?还是当我的字符串处理代码停止工作时,我是否会大吃一惊?
- 在构建 DLL 后是否保留了其他一些语言功能,或者我是否需要更改我的工作流程以解决其他问题?
特别是,让我们看看一些超级基本的东西,比如外部方法。
#define CALLING_CONVENTION __stdcall
#if _WIN32
#define DLLEXPORT(type) extern "C" __declspec(dllexport) type CALLING_CONVENTION
#else
#define DLLEXPORT(type) extern "C" type CALLING_CONVENTION
#endif
DLLEXPORT(void) DoSomething(const wchar* ManagedString);
// expands to
// extern "C" __declspec(dllexport) void __stdcall DoSomething(const wchar* ManagedString)
// on Windows
对于托管,
[DllImport("DllName", CharSet = CharSet.Unicode)]
public static extern void DoSomething([MarshalAs(UnmanagedType.LPWStr)] string input);
这是否也会保持与其他平台的互操作性?还是我需要特意在 Linux 上构建 C++ DLL,然后将 that 用于 Android 平台?
【问题讨论】:
-
“在 Linux 上构建 C++ DLL” -- 无法完成。 Linux 使用
.so(共享对象)文件而不是 Windows 特定的 DLL 格式。您可能能够从 C++ 源代码在 Linux 上构建共享库,但不能构建 DLL。您的意思是“共享库”而不是“DLL”还是您提出问题的原因? -
@JaMiT 在这种情况下,我的问题仍然是一样的。在 Android 上部署时,是否需要将项目重建为 *.so 以将其用于 Unity 项目?
-
@JaMiT -- 在 Linux 上运行的编译器无法创建 DLL 没有技术原因。您无法在 Linux 上使用 DLL,因为 Linux 以特定于 Linux 的 .so 格式传输。
-
@PeteBecker 是的,这在技术上是正确的,但这并不是 OP 真正在谈论的内容。在 Linux 上交叉编译 Windows DLL 将使用 Windows ABI,就像在 Windows 上编译它一样。 OP 认为切换到 Linux 会改变 ABI(即使 OP 不知道术语“ABI”)。我正要提到 Android 无法使用 DLL,但 WineHQ 可能不同意...
标签: c# c++ unity3d cross-platform interop