【发布时间】: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