【问题标题】:Returning binary data from c# COM object to be used in ASP从 c# COM 对象返回二进制数据以在 ASP 中使用
【发布时间】:2014-03-04 13:52:21
【问题描述】:

我正在寻找一种将字节数组从 c# COM 对象传递到 IIS/ASP(不是 .NET)的方法。我打算使用字符串来传递它,但是虽然 ASP 可以毫无问题地处理字符串中的二进制数据,但 C# 却没有。这意味着我不能期望转换为字符串并传递给 ASP 的字节数组与原始数组相同。此外,当在 ASP 中有数组时,我需要将其作为响应 (Response.Write) 原封不动地发送。

我发现 this SO answer - How to correctly marshal VB-Script arrays to and from a COM component written in C# 解释了如何传递数组,但我不清楚我应该如何传递字节数组以及如何在 ASP 中将数组组装成字符串。

任何指针?我已经有了 COM 对象并且可以来回传递数据(字符串、整数等)。字节数组部分让我望而却步。

编辑:这是我现在使用的(以及根本不起作用的):

    [DispId(1003)]
    byte[] arrayOut { set; get; }

【问题讨论】:

  • 目前我正在考虑将磁盘上的数据存储在 C# COM 对象中,并将文件名传递给 ASP 以供其读取,但似乎更直接的方式应该是可能的。
  • 这里有一些信息可能会有所帮助:motobit.com/tips/detpg_binarytostring 我过去曾成功使用过 CreateObject("ADODB.Recordset") 和 AppendChunk。

标签: c# arrays asp-classic com byte


【解决方案1】:

原来我关于显示的代码根本不工作的原始结论是错误的。似乎 .NET 进行了必要的包装,问题出在我的 ASP 部分。我使用的是Response.Write,它显示了乱码(中文)输出,但是当我切换到使用Response.BinaryWrite时,它工作得很好。因此,事实证明手动编组数组不是必需的。

基本的 C# 项目是这样设置的。

首先是一个界面:

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
interface FillArrayI
{
    // Properties
    [DispId(1000)]
    byte[] result_array { set; get; }

    [DispId(2000)]
    int fill_result_array();
}

下一节课:

[ProgId("ArrayTest.FillAray")]
[GuidAttribute("51E7819D-3EF3-4498-B5BE-5D6B8EF98176")] // some guid
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class FillArray : FillArrayI
{
    public byte[] result_array{ set; get; }
    public int fill_result_array()
    {
        result_array = new byte[95];
        for(int i = 0; i < 95; result_array[i] = i+32;
        return 0;
    }
}

编译并加载 COM 对象(其中一个或两个,对于使用的 .NET 版本正确):

"%WINDIR%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" ArrayTest.dll /tlb /codebase /register
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" ArrayTest.dll /tlb /codebase /register

使用此 ASP 文件加载:

Dim comObj
Set comObj = Server.CreateObject("ArrayTest.FillArray")
returnCode = comObj.fill_result_array
Response.WriteBinary comObj.result_array

我相信这应该可以解决问题。

【讨论】:

  • 您能否为这两个部分(C# 和 ASP)添加示例代码,以帮助其他解决此问题的人?
  • 我没有代码了,但我会尝试添加我认为从 C# COM 对象中获取字节数组所需的内容。
【解决方案2】:

离开你在问题中提到的文章你试过吗?

[DispId(1003)]
byte[] arrayOut {
  [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
  get;
}

您的问题是 Classic ASP 使用 VBScript,它需要 SAFEARRAY 变体,因此您需要编组您的属性以返回它。

【讨论】:

  • 其实,在 ASP 文件中使用Response.BinaryWrite 就足够了。我在 C# 中声明的就是我最终得到的。我只是不知道 BinaryWrite 命令,只是使用了 Write 输出乱码数据。这最终应该成为答案吗?
  • @galmok 是的,您应该将其添加为答案,以帮助遇到此问题的其他人。见Can I answer my own question?
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 2010-11-24
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2018-12-31
相关资源
最近更新 更多