我看了几个类似于这个标题的问题,但它们要么不谈论命令行,要么因为某种原因而不适合我。根据我所读到的,我似乎可以“简单地”做以下几件事:
虚拟代码(C#):
using System;
public static class Foo {
public static void Bar() {
Console.WriteLine("o3o");
}
}更多虚拟代码(VisualC++):
#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,但我找不到任何链接DLL的选项,类似于GCC的-l选项。试图将DLL与.obj一起传递给link时,它会告诉我不支持链接程序集。但有趣的是,如果我构建了一个.netmodule而不是一个DLL,即:
csc /out:test.dll /t:module src\cs\Foo.cs并将#using指令更改为
#using <test.netmodule>可执行文件无错误地运行。这感觉有点奇怪,因为我认为没有人在.netmodules中打包代码(不管怎么说,.netmodules是什么?)
发布于 2017-02-06 16:45:19
您的所有步骤都应该有效,但一个非常简单的问题是阻止您的程序运行。
即:您的C# DLL程序集名称为test,您的C++/CLI程序集具有相同的名称。他们都有相同的身份。
因此,当在Foo::Bar程序集中查找test时,加载程序首先检查程序集是否加载在AppDomain中。它是-它是您的C++/CLI,您不能在同一个AppDomain中同时加载多个具有相同标识的程序集。您的C# dll甚至没有尝试。
只要改变其中任何一个,一切都会好起来的:
link /out:test2.exe test.obj至于什么是.netmodule,它是用于静态链接托管代码的格式,这就是为什么您能够将您的C#代码与您的C++/CLI代码毫无问题地链接起来。它大致相当于托管代码的.lib文件。
你说得对,它不是经常用的。
https://stackoverflow.com/questions/42072326
复制相似问题