我目前正在开发一个Excel宏,它允许在Bugzilla实例中创建Bugs。 经过一些试验和错误,现在结果证明工作正常。 我想增强客户端,以便也可以为新创建的bug添加屏幕截图。
我正在使用的环境有点棘手: 我必须使用MS Excel来完成我的任务。 由于Excel不理解XML-RPC,我下载了一个接口DLL(来自xml-rpc.net的CookComputing.XmlRpcV2.dll),它使得XML-RPC接口可以从.NET访问。 然后我创建了一个额外的DLL,可以从Excel宏调用(使用COM互操作)。
如前所述,这适用于浏览或添加新错误等任务。 但是当向bug添加附件时,必须将图像转换为base64数据类型。虽然这似乎工作正常,虽然截图的创建似乎成功,但图像似乎已损坏且无法显示。
以下是我添加图片的方法: Bugzilla add_attachment方法接受结构作为输入: http://www.bugzilla.org/docs/4.0/en/html/api/Bugzilla/WebService/Bug.html#add_attachment。 此类型在C#中定义,在VBA中也可见。
这是结构定义:
[ClassInterface(ClassInterfaceType.AutoDual)]
public class TAttachmentInputData
{
public string[] ids;
public string data; // base64-encoded data
public string file_name;
public string summary;
public string content_type;
public string comment;
public bool is_patch;
public bool is_private;
public void addId(int id)
{
ids = new string[1];
ids[0] = id.ToString();
}
public void addData(string strData)
{
try
{
byte[] encData_byte = new byte[strData.Length];
encData_byte = System.Text.Encoding.ASCII.GetBytes(strData);
string encodedData = Convert.ToBase64String(encData_byte);
data = new Byte[System.Text.Encoding.ASCII.GetBytes(encodedData).Length];
data = System.Text.Encoding.ASCII.GetBytes(encodedData);
}
catch (Exception e)
{
throw new Exception("Error in base64Encode" + e.Message);
}
}
这是我宏中要添加附件的部分:
Dim attachmentsStruct As New TAttachmentInputData
fname = attachmentFileName
attachmentsStruct.file_name = GetFilenameFromPath(fname)
attachmentsStruct.is_patch = False
attachmentsStruct.is_private = False
'multiple other definitions
Open fname For Binary As #1
attachmentsStruct.addData (Input(LOF(1), #1))
Close #1
attachmentsStruct.file_name = GetFilenameFromPath(fname)
Call BugzillaClass.add_attachment(attachmentsStruct)
BugzillaClass将接口从我的DLL暴露给Excel VBA。
方法add_attachment
引用XML-RPC方法add_attachment
。
我认为我的问题是从二进制文件转换为base64。
这是使用我的C#DLL中的addData
方法完成的。
转换是否正确完成?
知道为什么图像被破坏了吗?
答案 0 :(得分:1)
我认为问题在于您正在读取宏中的二进制数据,但addData方法需要一个字符串。尝试将addData中的参数声明为byte []。