gpt4 book ai didi

c# - 在托管 C++ 中使用 C# DLL(命令行)

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:49 25 4
gpt4 key购买 nike

我已经查看了几个标题与此类似的问题,但它们要么不谈论命令行,要么由于某种原因似乎对我不起作用。从我读到的内容来看,似乎我可以“简单地”执行以下操作:

虚拟代码(C#):

using System;

public static class Foo {
public static void Bar() {
Console.WriteLine("o3o");
}
}

更多伪代码(Visual C++):

#using <test.dll>

int main() {
Foo::Bar();
return 0;
}

C# DLL 编译使用:

csc /out:test.dll /t:library src\cs\Foo.cs

使用以下方法编译的 Visual C++ 目标文件:

cl /Ox /clr /AI. /c src\vc\test.cpp

可执行文件编译使用:

link /out:test.exe test.obj

运行可执行文件时抛出以下异常:

Unhandled Exception: System.TypeLoadException: Could not load type 'Foo' from assembly 'test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
at main()
at mainCRTStartup()

我有一种强烈的感觉,我应该在链接阶段也引用 DLL,但是我找不到任何类似于 GCC 的 -l 选项的链接 DLL 的选项。尝试将 DLL 与 .obj 一起传递给 link 会导致它告诉我不支持链接程序集。不过,有趣的是,如果我构建一个 .netmodule 而不是 DLL,即:

csc /out:test.dll /t:module src\cs\Foo.cs

并将#using指令更改为

#using <test.netmodule>

可执行文件运行没有错误。这感觉有点奇怪,因为我认为没有人将代码打包到 .netmodule 中(无论如何 .netmodule 是什么?) .

最佳答案

您的所有步骤都应该有效,但一个非常简单的问题导致您的程序无法运行。

即:您的 C# DLL 程序集名称是 test,并且您的 C++/CLI exe 程序集具有相同的名称。他们都有相同的身份。

所以当在test 程序集中寻找Foo::Bar 时,加载器首先检查该程序集是否加载到AppDomain 中。它是 - 它是您的 C++/CLI exe,并且您不能在同一个 AppDomain 中同时加载多个具有相同标识的程序集。您的 C# dll 甚至都没有尝试过。

只需更改其中一个,一切都会正常工作:

link /out:test2.exe test.obj

至于什么是 .netmodule,它是用于静态链接托管代码的格式,这就是为什么您成功地将 C# 代码与 C++/CLI 代码链接起来没有问题。它大致相当于托管代码的.lib 文件。
你是对的,它并不经常使用。

关于c# - 在托管 C++ 中使用 C# DLL(命令行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42072326/

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