【问题标题】:RGiesecke dll Export templateRGiesecke dll 导出模板
【发布时间】:2014-09-29 19:13:26
【问题描述】:

我需要创建一个可以从 PowerBuilder 12.5 调用的 dll。我在https://sites.google.com/site/robertgiesecke/Home/uploads#TOC-Samples 找到了 RGiesecke.DllExport 页面。我创建了以下非常简单的 c# 项目作为控制台应用程序,并在向导中选择了 dll:

VS2013 framework 3.5
Windows 7 

using System;
using System.Collections.Generic;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace PRS
{
   internal static class UnmanagedExports
   {
     [DllExport("getsmoochie", CallingConvention = CallingConvention.StdCall)]
     static string GetSmoochie()
     {
         return "Success";
     }
   }
}

我在发布模式下编译为 32 位,然后尝试从 PowerBuilder 访问 dll:

Function string GetSmoochie() library "PRS.dll"

我找回了看起来像汉字的东西。

此外,我发现一件有点奇怪的事情:如果我尝试使用 Regsvr32 注册 dll,我会收到错误消息,告诉我没有 dll 入口点。我不知道该怎么想。

我对 PowerBuilder 有额外的 dll 需求,但我似乎无法让最简单的东西工作。任何帮助将不胜感激。

谢谢。

更新:

我突然想到,在这种情况下,取回一个损坏的字符串可能不是问题,因为我确实需要执行的代码将文件发送到 Web 服务,所以我实现了 SendFile() 代码,它在 PowerBuilder 中工作。

我对上述代码所做的一项更改是在方法调用中添加了关键字“public”。

总结:RGiesecke dll 导出模板有效!

更新: 请参阅下面的说明。这是我使用传入的文件名的调用:

[DllExport("sendfile", CallingConvention = CallingConvention.StdCall)]
public static long SendFile(String filename)

由于文件名硬编码的代码有效,我不得不假设文件名以某种方式被破坏并且 dll 无法找到它。

有什么想法吗?

【问题讨论】:

  • 如果您运行depends.exe 并加载您构建的DLL,它是否显示任何导出?它应该至少显示您的 getsmoochie 导出。
  • 关于运行 Regsvr32 的问题,该工具通过调用 dll 本身中的 DLLRegisterServer 入口点来工作。普通的 .net dll 不会导出该入口点,因此 Regsvr32 将毫无用处。此外,Regsvr32 通常用于注册 COM 服务器 dll,因此除非您要导出 COM 对象,否则 regsvr32 不需要注册 dll
  • 但是,您可以自己创建和导出该入口点,然后拥有一个 regsvr32 可注册的 .net dll。但首先要做的事情是:)
  • PowerBuilder 12.5 字符串是 Unicode。如果您的 DLL 使用 Ansi 字符串,则可以解释“中文”字符。
  • 感谢大家的帮助。 @DARINH:Depends.exe - 在左上角带有“E”的框架中,我确实在 FUNCTION 列下看到了 getsmoochie。我也意识到我不需要注册 dll,但我想看看我在尝试这样做时是否出错。

标签: c# dll powerbuilder


【解决方案1】:

您也必须编组您的返回值。这段代码对我有用:

[DllExport("ExpTest", CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static string ExpTest([MarshalAs(UnmanagedType.LPWStr)] string sText, out int length)
{
    MessageBox.Show(sText);
    length=sText.Length;
    return sText;
}

PB 11.5 经典版
目标框架 .NET 4.5.2
平台目标 x86

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多