在一个程序集中从本机调用 C#
Calling C# from native within one assembly
我遇到了以下问题:
我有本机 C 代码 .api 需要通过一些函数定义对其进行扩展以使其适应我们的功能。我可以用 C 代码对其进行调整,在 VS 解决方案中编译它,有效!
现在我想从上面提到的 C 代码调用 C# 代码。我这样做了:
[带扩展的原生 C] --> [托管 C++] --> [C#]
这也行。
问题:如何减少程序集的数量?
我目前发现的:
- 使用 CLR 选项编译本机 C,因为本机代码崩溃而无法正常工作。
- 使用 ILMerge 合并托管 C++ 和 C#(作为 post-构建操作)
原因:
出于安全原因,我们希望加密尽可能多的部分。因此最好是一个 .exe.
遗憾的是,您无法将本机程序集与 CLR 程序集打包在一起。但是,您可以:
- 使用 ILMerge 将所有纯 CLR 程序集合并为一个程序集;
- 将所有本机程序集(C、C++ 和托管 C++)静态地link 到单个 DLL 中。
因此您只有两个文件,一个是本机代码,一个是纯托管代码。您或许可以使用嵌入式资源将本机程序集嵌入托管程序集(参见 this msdn article or this Whosebug question)。
我遇到了以下问题:
我有本机 C 代码 .api 需要通过一些函数定义对其进行扩展以使其适应我们的功能。我可以用 C 代码对其进行调整,在 VS 解决方案中编译它,有效!
现在我想从上面提到的 C 代码调用 C# 代码。我这样做了:
[带扩展的原生 C] --> [托管 C++] --> [C#]
这也行。
问题:如何减少程序集的数量?
我目前发现的:
- 使用 CLR 选项编译本机 C,因为本机代码崩溃而无法正常工作。
- 使用 ILMerge 合并托管 C++ 和 C#(作为 post-构建操作)
原因: 出于安全原因,我们希望加密尽可能多的部分。因此最好是一个 .exe.
遗憾的是,您无法将本机程序集与 CLR 程序集打包在一起。但是,您可以:
- 使用 ILMerge 将所有纯 CLR 程序集合并为一个程序集;
- 将所有本机程序集(C、C++ 和托管 C++)静态地link 到单个 DLL 中。
因此您只有两个文件,一个是本机代码,一个是纯托管代码。您或许可以使用嵌入式资源将本机程序集嵌入托管程序集(参见 this msdn article or this Whosebug question)。