创建AdWords API服务时会导致TargetInvocationException的原因是什么?

时间:2012-03-02 00:50:27

标签: c# google-adwords

我正在学习a .Net library以连接到AdWords API。当我尝试使用AdWordsUser对象创建服务时,我的第一个块出现了。我得到了TargetInvocationException

Exception has been thrown by the target of an invocation

内部异常:

The value of the property 'type' cannot be parsed. The error is: Could not
load file or assembly 'Google.Ads.Common, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=52807268f2b614dc' or one of its dependencies. The located
assembly's manifest definition does not match the assembly reference. (Exception
from HRESULT: 0x80131040)

根据我的谷歌搜索,建议的主要修复是在app.config中添加对SoapListenerExtension的引用。我已经尝试了两种方法(在问题的最后显示),没有任何改变。

我的应用包括对Google.Ads.CommonGoogle.AdWordsSystem.Web.Services库的引用。这是我的代码,扩展引用以消除歧义。

var  headers    = new Dictionary<string, string>();
headers.Add("email", Properties.Settings.Default.AdWordsUserName);
// Rest of the creds
var  _user      = new Google.Api.Ads.AdWords.Lib.AdWordsUser(headers);
var  sig        = Google.Api.Ads.AdWords.Lib.AdWordsService.v201109.CampaignService;
var  rawService = _user.GetService(sig);  // The exception is thrown here
var  service    = (Google.Api.Ads.AdWords.v201109.CampaignService)rawService;

如果我省略密码就没有变化,所以我不认为这是我的信条问题:代码还没有那么远。

Google.AdWords库包含Google.Api.Ads.Common.Lib命名空间中的一些类,但不包括SoapListenerExtension。这可能隐藏在这个库中的其他DLL中吗?

我在这里看了十几个与AdWords API相关的问题,但没有任何与此特定错误有关的问题。


修改

使用AppDomain.CurrentDomain.GetAssemblies(),我已轮询加载的程序集。如果我包含这条无害的行:

var  cs = Google.Api.Ads.AdWords.Lib.AdWordsService.v201109.CampaignService;

此程序集已加载,似乎已成功:

Loaded: Google.Ads.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

...所以看起来我的组件是无符号的。果然,有一个签名版本的API可用。疯狂地,它的结构与未签名的版本不同,并且大多数完全限定的名称不再有效。回到绘图板。


附录

Web服务方法1:

  <system.web>
    <webServices>
      <soapExtensionTypes>
        <add type="Google.Api.Ads.Common.Lib.SoapListenerExtension, Google.Ads.Common" priority="1" group="0"/>
      </soapExtensionTypes>
    </webServices>
  </system.web>

方法2:

<system.web>
    <webServices>
        <soapExtensionTypes>
            <add type="Google.Api.Ads.Common.Lib.SoapListenerExtension, Google.Ads.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=52807268f2b614dc" priority="1" group="Low"/>
        </soapExtensionTypes>
    </webServices>
</system.web>

1 个答案:

答案 0 :(得分:0)

交换我对已签名版本的引用就可以了。回想起来,我认为错误信息指的是相当清楚。我想知道无符号版本的用途是什么,或者换句话说,为什么只有签名版本才能在这个实例中工作?