C# "Unmanaged Exports"

标签 c# unmanaged

<分区>

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

我几乎复制了示例并将构建/配置管理器/事件平台设置为 x86。我能以某种方式检查执行所有魔术的 MSBuild 任务是否实际运行了吗?项目文件应该包含什么(对我来说它似乎是可疑的空?)

最佳答案

我建议您按照记录的方式执行此操作,而不是依赖不提供支持的作者的未记录的 hack。让我们举个例子:

namespace Publics {
    public class Class1 {
        public static void Run() { 
            // Stuff...
        }
    }
}

向您的项目添加一个新的 C++/CLI 类库。右键单击解决方案,添加,新建项目。打开“其他语言”节点、Visual C++、CLR,然后选择“类库”项目模板。右键单击新项目,Properties,Common Properties,Framework and References,单击 Add New Reference 按钮。从“项目”选项卡中,选择要导出其方法的 C# 项目。

删除预先生成的带有//TODO注释的空类,写出这样的代码:

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

构建您的解决方案。通过在 DLL 上运行 dumpbin.exe/exports 检查示例函数是否已导出。您应该会看到与此类似的内容:

      1    0 00001020 _Example@0 = _Example@0

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

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

等等,如果您要对此进行详细说明,则需要熟悉 C++/CLI 语言。最后但并非最不重要的一点是,您还可能会发现在最初尝试使 Giesecke 的 IL 重写器工作时出了什么问题。否则,它使用与 C++/CLI 编译器用于导出托管方法完全相同的技术。

关于C# "Unmanaged Exports",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17127825/

相关文章:

c# - HttpContent.ReadAsAsync 反序列化问题

c# - 如何找出这些 dwFlags 常量的值?

c++ - 静态方法节省内存? (非托管代码)

c# - 如何使用结构指针导入非托管dll?

c# - 如何从 C# 系统托盘应用程序将 C 程序作为线程运行?

c# - 使用 Unity 在 C# 中发送 http 请求

c# - 以特定顺序返回 XML 节点

c# - 如何将自定义字符串解析为 DateTime C#?

C# 调用非托管 C++ 返回正方形符号字符串

c# - 记录哪个组件正在哪个路径下搜索哪个dll