Cast Managed Com объект к интерфейсу без регистрации сборки источникаC#

Место общения программистов C#
Anonymous
 Cast Managed Com объект к интерфейсу без регистрации сборки источника

Сообщение Anonymous »

Я переписываю слово «добавление», которое имеет следующую базовую структуру: < /p> разоблачает метод setController . Этот метод используется для передачи экземпляра imycontroller к добавлению. Затем он используется для связи между приложением C# и C# Addin.
myaddin.dll зарегистрирован для Com Interop. Он реализует requestComadDinaUtomationservice (MS Office Thing), который возвращает объект COM, который затем позволяет приложению вызовать метод SetController . Это выглядит примерно так: < /p>

Код: Выделить всё

using MyWordAddIn;
using System.Runtime.InteropServices;

namespace MyWordAddIn;

[ComVisible(true)]
[Guid(IAddInUtilities_GUID)]
public interface IAddInUtilities
{
void SetController(object obj);
}

[ComVisible(true)]
[Guid(AddInUtilities_GUID)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IAddInUtilities))]
public class AddInUtilities : StandardOleMarshalObject, IAddInUtilities
{
public void SetController(object obj)
{
Globals.ThisAddIn.Controller = obj;
}
}
Теперь в приложении для потребителей, когда я получаю экземпляр AddInutilities , я могу отливать и использовать его как:

Код: Выделить всё

var comInstance = ...;
var addInUtilities = (MyWordAddIn.IAddInUtilities)comInstance;
var ctrl = new Controller();
ctrl.Text = "test";
addInUtilities.SetController(ctrl);
< /code>
с контроллером, определенным таким: < /p>
[ComVisible(true)]
[Guid(Controller_GUID)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Controller
{
public string Text { get; set; }
}
Теперь вернемся в Addin,. Controller устанавливается на экземпляр Comobject, и я могу прочитать текст , если я отмените его в Dynamic :

Код: Выделить всё

string txt = ((dynamic)this.Controller).Text;
Я бы предпочел, чтобы вместо этого поднять класс/интерфейс, но я не могу понять, как. Я всегда получаю InvalidcastException , однако я стараюсь определить интерфейс, на который можно было. Я думаю, что если я зарегистрирую приложение DLL, это сработает, но я бы хотел избежать его. В худшем случае я всегда могу использовать обертку вокруг динамического , но я действительно хотел бы избежать этого.


Подробнее здесь: https://stackoverflow.com/questions/794 ... e-assembly

Вернуться в «C#»