C#"非托管出口"

use*_*608 10 c# unmanaged

我一直在尝试使用Robert Giesecke在Visual Studio 2010 pro/C#项目中的扩展"Unmanaged Exports".然而,我无法使其工作 - 当我检查编译的DLL导出时,查看器(http://www.nirsoft.net/utils/dll_export_viewer.html)总是空出来,似乎没有定义出口所有.

我已经复制了示例,并将build/config manager/active平台设置为x86.我可以以某种方式检查执行所有魔法的MSBuild任务是否实际运行?项目文件应该包含什么(对我来说似乎是空洞的?)

Han*_*ant 22

我建议你以记录的方式执行此操作,而不是依赖于未提供支持的作者的无证件黑客攻击.让我们用一个例子来做:

namespace Publics {
    public class Class1 {
        public static void Run() { 
            // Stuff...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将新的C++/CLI类库添加到项目中.右键单击解决方案,添加,新建项目.打开"其他语言"节点,Visual C++,CLR,然后选择"类库"项目模板.右键单击新项目,"属性","公共属性","框架和引用",然后单击"添加新引用"按钮.从"项目"选项卡中,选择要导出其方法的C#项目.

使用// TODO注释删除预先生成的空类,并编写以下代码:

extern "C" __declspec(dllexport)
void __stdcall Example() 
{
    Publics::Class1::Run();
}
Run Code Online (Sandbox Code Playgroud)

构建您的解决方案 通过在DLL上运行dumpbin.exe/exports来检查示例函数是否已导出.你应该看到类似的东西:

      1    0 00001020 _Example@0 = _Example@0
Run Code Online (Sandbox Code Playgroud)

除了名称和调用约定之外,您现在还有很多选择来调整导出的函数.如果要导出实例方法而不是静态方法,可以像这样编写函数:

extern "C" __declspec(dllexport)
void __stdcall Example() 
{
    Publics::Class1^ obj = gcnew Publics::Class1;
    obj->Run();
}
Run Code Online (Sandbox Code Playgroud)

如果您要详细说明,则需要熟悉C++/CLI语言.最后但同样重要的是,您也可能会发现您最初尝试使Giesecke的IL重写器工作出现问题.否则,它使用与C++/CLI编译器用于导出托管方法完全相同的技术.

  • +1我非常感谢本教程.我学到了一些东西 我一直认为UnmanagedExports正在表演某种黑魔法.很高兴另外学习. (2认同)
  • 是。是。试试吧。 (2认同)

Tom*_*get 1

我一直在使用版本 1.1.3,现在有一个支持 NuGet 的新版本。我刚刚做了一个测试。

我可以以某种方式检查执行所有操作的 MSBuild 任务是否实际运行吗?

您可以使用命令行从 MSBuild 获取更多详细信息,或调整 Visual Studio 请求的详细程度:Tools > Options > Project and Solutions > Build and Run > MSBuild project build output verbosity[VS 2010]。完成故障排除后,您可能需要立即重置它。

我看到目标和任务正在被调用,但没有看到任何结果,直到我将项目平台切换到 x86。然后我看到各种相关的日志条目,包括Adding .vtentry:0 .export......

项目文件应该包含什么(对我来说它似乎是空的?)

项目文件中没有太多需要的内容。NuGet 完成这一切:对 DllExport 程序集的引用和目标文件的包含。

我能想到的一些事情可能会让你绊倒:

  1. 确保您确实正在构建该项目。解决方案生成管理器可能有一些项目未设置为针对所选解决方案配置进行生成。
  2. 确保您检查的是正确的 DLL。构建任务将路径写入构建日志中。该行以 开头Assembling