gpt4 book ai didi

c++ - 将托管 C# DLL 包含到非托管 C++ DLL 中——全部在一个文件中

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:13 25 4
gpt4 key购买 nike

简介:How do I combine an unmanaged dll and a managed assembly into one file?

In comparison to the question above i need to combine DLLs so that final mixed DLL could export their functions to other unmanaged applications.

为此,我想将它们都编译为 .netmodule,然后使用链接器将它们合并到一个文件中,所以我有:

1) Libs - 在 C# 中包含一些库的项目 - 它没有任何依赖关系,我可以像 .netmodule 一样轻松地编译它

2) 链接 - 引用了 C# 库的 C++ 非托管项目,不幸的是我无法使用 cl.exe 编译器构建它,因为它总是给出一个错误,指出无法找到来自 C# 库的命名空间,即使我尝试了将编译器指向它可以找到对我的 C# 程序集的引用的所有文件夹,这个 C++ 项目就像一个简单的 C++ 包装器一样使用 C# 中的 CLR 方法

这是我的批处理脚本,第二行抛出一个错误:

"c:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe" /target:module /out:./Build/libs.netmodule Libs\Properties\*.cs Libs\*.cs
"c:/Program Files/Microsoft Visual Studio 12.0/VC/bin/cl.exe" /clr /AI"D:\T\CPlus\Library\Release" /AI"D:\T\CPlus\Library\Libs" /AI"D:\T\CPlus\Library\Libs\Properties" /LN Links\*.cpp

问题:现在有人如何让 C++ 知道在哪里可以找到 C# 程序集来解析引用,或者我可能需要以某种方式在批处理命令中明确提及我的头文件?

源代码: C# 只是带有方法 Foo 的空类,而 C++ 看起来像这个。

// Links.h

#pragma once

#define DllExport extern "C" __declspec(dllexport)

using namespace System;
using namespace Libs; // cl.exe cannot resolve this reference

// Links.cpp

#include "Links.h"

DllExport int __stdcall Execute()
{
Libs::CLibrary::Foo();
}

最佳答案

这是最终的工作版本。

"c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /target:module /out:Libs.netmodule /recurse:..\Libs\*.cs
"c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\cl.exe" /clr /LN /Fo /Y- /Z7 /FU Libs.netmodule ..\Links\Links.cpp /link /LIBPATH:"c:\Program Files\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"c:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib"
"c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\link.exe" /DLL /LTCG /CLRIMAGETYPE:IJW /OUT:Library.dll Libs.netmodule Links.obj /LIBPATH:"c:\Program Files\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"c:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib"

有用的链接:

现在我可以在非托管应用程序中使用从 .NET 导出的函数。此外,来自两个项目——Links (C++) 和 Libs (C#)——的所有信息都集中在一个文件——Library.dll 中。这样一来,我可以将任意多个项目合并到一个 DLL 中,而不管它们是托管的还是 native 的。

关于c++ - 将托管 C# DLL 包含到非托管 C++ DLL 中——全部在一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26226958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com