首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在托管C#中使用C++ DLL (命令行)

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

Stack Overflow用户
提问于 2017-02-06 16:12:48
回答 1查看 869关注 0票数 1

我看了几个类似于这个标题的问题,但它们要么不谈论命令行,要么因为某种原因而不适合我。根据我所读到的,我似乎可以“简单地”做以下几件事:

虚拟代码(C#):

代码语言:javascript
复制
using System;

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

更多虚拟代码(VisualC++):

代码语言:javascript
复制
#using <test.dll>

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

使用以下方法编译的C# DLL:

代码语言:javascript
复制
csc /out:test.dll /t:library src\cs\Foo.cs

使用以下方法编译的Visual C++对象文件:

代码语言:javascript
复制
cl /Ox /clr /AI. /c src\vc\test.cpp

使用以下方法编译的可执行文件:

代码语言:javascript
复制
link /out:test.exe test.obj

在运行可执行文件时引发以下异常:

代码语言:javascript
复制
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,即:

代码语言:javascript
复制
csc /out:test.dll /t:module src\cs\Foo.cs

并将#using指令更改为

代码语言:javascript
复制
#using <test.netmodule>

可执行文件无错误地运行。这感觉有点奇怪,因为我认为没有人在.netmodules中打包代码(不管怎么说,.netmodules是什么?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-06 16:45:19

您的所有步骤都应该有效,但一个非常简单的问题是阻止您的程序运行。

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

因此,当在Foo::Bar程序集中查找test时,加载程序首先检查程序集是否加载在AppDomain中。它是-它是您的C++/CLI,您不能在同一个AppDomain中同时加载多个具有相同标识的程序集。您的C# dll甚至没有尝试。

只要改变其中任何一个,一切都会好起来的:

代码语言:javascript
复制
link /out:test2.exe test.obj

至于什么是.netmodule,它是用于静态链接托管代码的格式,这就是为什么您能够将您的C#代码与您的C++/CLI代码毫无问题地链接起来。它大致相当于托管代码的.lib文件。

你说得对,它不是经常用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42072326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档