从c#COM对象返回二进制数据以在ASP中使用

时间:2014-03-04 13:52:22

标签: c# arrays asp-classic com byte

我正在寻找一种方法将字节数组从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; }

2 个答案:

答案 0 :(得分: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

我相信应该这样做。

答案 1 :(得分:0)

关掉你在问题中提到的文章你试过吗?

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

你的问题是Classic ASP使用VBScript,它需要SAFEARRAY的变种,所以你需要封存你的属性来返回它。