petapoco模板修改

[Reference(ReferenceType.Many, ColumnName = "OneId", ReferenceMemberName = "OneId")]api

var user = Database.FetchOneToMany<UserDecoratedWithExtraInfoAsList>(
x => x.ExtraUserInfo,
x => x.UserId,
"select u.*, e.* from users u left join extrauserinfos e on u.userid = e.userId where u.userid = 1").Single();app

 

[ResultColumn, Reference(ReferenceType.Many)]
public List<ExtraUserInfoDecorated> ExtraUserInfo { get; set; }dom

Right click .tt file and then "Debug T4 Template"ide

 

https://stackoverflow.com/questions/41000524/visual-studio-serialization-error-when-t4-uses-dte-to-open-generated-filevisual-studio

GetService改成GetCOMService

IServiceProvider.GetService(typeof(DTE)) returns a Proxy Object. Proxy objects work by serializing data across app domains. You can confirm dte is a "transparent proxy" like this:this

bool isProxy = RemotingServices.IsTransparentProxy(dte);

The EnvDTE assemblies are COM interop assemblies. Your error can be avoided by creating a Runtime Callable Wrapper, which can intelligently marshal calls to the COM object based off information in the interop-assembly. Microsoft has provided an extension method within theMicrosoft.VisualStudio.TextTemplating namespace:spa

<#@ template hostspecific="true" language="C#" #> <#@ assembly name="EnvDTE" #> <#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> <# IServiceProvider serviceProvider = (IServiceProvider)this.Host; EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetCOMService(typeof(EnvDTE.DTE)); #>

The GetCOMService(this IServiceProvider, Type type) extension method is the correct way to obtain the dte COM object. I'm not aware of the absolute specifics, but the RCW alters how the method calls between your code and the COM object get serialized into a data stream..net

T4 templates run in a separate AppDomain, and I believe that is the reason your code is working despite the exception.code

 

https://blog.csdn.net/weixin_42930928/article/details/89513174orm

相關文章
相關標籤/搜索