首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ASP.NET中使用的c# COM对象返回二进制数据

从ASP.NET中使用的c# COM对象返回二进制数据
EN

Stack Overflow用户
提问于 2014-03-04 13:52:21
回答 2查看 457关注 0票数 1

我正在寻找一种将字节数组从c# COM对象传递给IIS/ASP (而不是.NET)的方法。我本来打算使用字符串传递它,但是当ASP处理字符串中的二进制数据时,没有问题,而C#没有。这意味着,不能期望转换为string并传递给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对象,可以来回传递数据(字符串、int等)。字节数组部分避开了我。

编辑:这是我现在使用的内容(而且根本不起作用):

代码语言:javascript
复制
    [DispId(1003)]
    byte[] arrayOut { set; get; }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-07 15:26:06

原来,我对所示代码根本不起作用的最初结论是错误的。.NET似乎做出了必要的包装,问题就在我的ASP部分中。我使用的是Response.Write,它显示了错误的(中文)输出,但是当我切换到使用Response.BinaryWrite时,它工作得很好。因此,手动编组数组并不是必需的。

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

首先是一个接口:

代码语言:javascript
复制
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
interface FillArrayI
{
    // Properties
    [DispId(1000)]
    byte[] result_array { set; get; }

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

下一节课:

代码语言:javascript
复制
[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版本都是正确的):

代码语言:javascript
复制
"%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文件:

代码语言:javascript
复制
Dim comObj
Set comObj = Server.CreateObject("ArrayTest.FillArray")
returnCode = comObj.fill_result_array
Response.WriteBinary comObj.result_array

我相信这是个好办法。

票数 1
EN

Stack Overflow用户

发布于 2014-03-05 10:54:30

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

代码语言:javascript
复制
[DispId(1003)]
byte[] arrayOut {
  [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
  get;
}

您的问题是经典ASP使用的是VBScript,它需要一个变体的SAFEARRAY,所以您需要封送您的属性来返回它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22173830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档