Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Scripting.FileSystemObject写入方法失败_C#_Silverlight_Filesystemobject_Comautomationfactory - Fatal编程技术网

C# Scripting.FileSystemObject写入方法失败

C# Scripting.FileSystemObject写入方法失败,c#,silverlight,filesystemobject,comautomationfactory,C#,Silverlight,Filesystemobject,Comautomationfactory,因此,在我的程序中,我使用COM Auotmation(Silverlight 4中的AutomationFactory)创建一个FileSystemObject,并向其写入一个字符串(内容)。本例中的内容是一个小的UTF-8XML文件,我使用MemoryStream将其序列化为字符串 字符串很好,但由于某种原因,每当我调用FileSystemObject的Write方法时,我都会得到错误“HRESULT 0x800A0005(来自google的CTL_E_ILLEGALFUNCTIONCALL

因此,在我的程序中,我使用COM Auotmation(Silverlight 4中的AutomationFactory)创建一个FileSystemObject,并向其写入一个字符串(内容)。本例中的内容是一个小的UTF-8XML文件,我使用MemoryStream将其序列化为字符串

字符串很好,但由于某种原因,每当我调用FileSystemObject的Write方法时,我都会得到错误“HRESULT 0x800A0005(来自google的CTL_E_ILLEGALFUNCTIONCALL)。”最奇怪的是,如果我传递另一个简单字符串,如“hello”,它就可以正常工作

有什么想法吗

或者,如果有一种方法可以公开一个带有FileSystemObject的文件/文本流,我可以直接将其序列化,那也不错(我似乎找不到VB以外的任何东西)

提前谢谢

string theContent = System.Text.Encoding.UTF8.GetString(content, 0, content.Length);
string hello = "hello";

 using (dynamic fsoCom = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
 {
      dynamic file = fsoCom.CreateTextFile("file.xml", true);
      file.Write(theContent);
      file.Write(hello);
      file.Close();
 }
为什么不只是:

File.WriteAllText("file.xml", theContent, Encoding.UTF8);
甚至

File.WriteAllBytes("file.xml", content);

今天我用ADODB.Stream而不是Scripting.FileSystemObject解决了同样的问题

在Silverlight 4 OOB应用程序中(即使信任度提高),您也无法访问“MyDocuments”和其他几个与用户相关的特殊文件夹以外位置的文件。您必须使用“COM+自动化”解决方案。但是Scripting.FileSystemObject对于文本文件非常有效,它无法处理二进制文件。幸运的是,您也可以在那里使用ADODB.Stream。这可以很好地处理二进制文件。以下是我的代码,使用Word模板、.dotx文件进行了测试:

public static void WriteBinaryFile(string fileName, byte[] binary)
{
    const int adTypeBinary = 1;
    const int adSaveCreateOverWrite = 2;
    using (dynamic adoCom = AutomationFactory.CreateObject("ADODB.Stream"))
    {
        adoCom.Type = adTypeBinary;
        adoCom.Open();
        adoCom.Write(binary);
        adoCom.SaveToFile(fileName, adSaveCreateOverWrite);
    }
}
文件读取可以这样做:

public static byte[] ReadBinaryFile(string fileName)
{
    const int adTypeBinary = 1;
    using (dynamic adoCom = AutomationFactory.CreateObject("ADODB.Stream"))
    {
        adoCom.Type = adTypeBinary;
        adoCom.Open();
        adoCom.LoadFromFile(fileName);
        return adoCom.Read();
    }
}

我只是想问。。。你为什么在这里使用FSO?基本上,我正在用Silverlight(面向.NET应用程序的OOB Silverlight前端)做一些非常有趣的事情,所以我只限于AutomationFactory可以生产的东西。Silverlight应用程序没有足够的权限。