0

コントロールをワークシートに直接追加すると、例外が発生し続けます。コードはフォーム内に配置され、リボンの一部ではありません。

これが私のコードです:

// using TExcel = Microsoft.Office.Tools.Excel;
// MyGlobalsWrapper references the Globals object, which has been passed across an
// AppDomain barrier

Excel.Worksheet activeWorksheet = MyGlobalsWrapper.Application.ActiveSheet;
TExcel.Worksheet toolsSheet = MyGlobalsWrapper.Factory.GetVstoObject(activeWorksheet);
var range = activeWorksheet.Range["A1:F20"];

var button = new System.Windows.Forms.Button();
button.Text = "HELLO!";
button.Visible = true;

// Both of these fail with the same exception

// Add manually (as the Range object might be the problem
toolsSheet.Controls.AddControl(button,10,10,button.Width,button.Height,id);

// Add using a range (which is more ideal for my usage)
toolsSheet.Controls.AddControl(button,range ,id);

例外は次のとおりです。

System.Runtime.Serialization.SerializationException occurred
  Message=Type 'Microsoft.Office.Tools.Excel.ControlCollectionImpl' in Assembly 'Microsoft.Office.Tools.Excel.Implementation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
  Source=mscorlib
  StackTrace:
    Server stack trace: 
       at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
       at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
       at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
       at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
       at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
       at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
       at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
       at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
       at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage..ctor(IMethodReturnMessage mrm)
       at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage.SmuggleIfPossible(IMessage msg)
       at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
       at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)
    Exception rethrown at [0]: 
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       at Microsoft.Office.Tools.Excel.Worksheet.get_Controls()

私の参考文献は次のとおりです。

Microsoft.Office.Interop.Excel
   v12-CLR:v1.1.4322

Microsoft.Office.Interop.Excel.Extensions v12
   -CLR:2.0.50727

Microsoft.Office.ToolsMicrosoft.Office.Tools.CommonMicrosoft.Office.Tools.Common 。 v4.0.Utilities Microsoft.Office.Tools.Excel Microsoft.Office.Tools.Excel.v4.0.Utilities    v10-CLR:4.0.30919






でラップしてみましたSystem.Windows.Forms.UserControlが、同じ問題があります。

注:ボタンだけでなく、ユーザーコントロールをシートに埋め込むつもりなので、Windowsコントロールを利用したいと思います。私は単純なコントロールから始めて、作業を進めていました。そのため、Excelフレームワークによって提供されるコントロールではなく、Windowsフォームコントロール(できればUserControl)を使用するソリューションが必要です。

4

1 に答える 1

1

このコードを別のAppDomainで実行していますか?

その場合、ControlsCollectionはAppDomainバリアを越えてマーシャリングする必要があります。ほとんどのマーシャリングと同様に、これはシリアル化によって実現されます。

このコードをメインのExcelAppDomainで実行することは可能ですか?

于 2012-05-17T09:44:43.787 に答える