我正在寻找一种方法将字节数组从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; }
答案 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的变种,所以你需要封存你的属性来返回它。